diff --git a/.gitignore b/.gitignore index 075b254..5a473c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,7 @@ -/.quarto/ +/.quarto/ +# macOS +.DS_Store + +# Windows +Thumbs.db +Desktop.ini diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a490b61 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "githubPullRequests.ignoredPullRequestBranches": [ + "main" + ] +} \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 10ba936..e9582e6 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,32 +1,32 @@ -# Cytometry In R Code of Conduct - -Like the flow cytometry community as a whole, the Cytometry In R team and community is made up of a mixture of professionals and volunteers from all over the world, working on every aspect of the mission - including mentorship, teaching, and connecting people. - -Diversity is one of our huge strengths, but it can also lead to communication issues and unhappiness. To that end, we have a few ground rules that we ask people to adhere to. This code applies equally to founders, mentors and those seeking help and guidance. - -This isn’t an exhaustive list of things that you can’t do. Rather, take it in the spirit in which it’s intended - a guide to make it easier to enrich all of us and the technical communities in which we participate. - -This code of conduct applies to all spaces managed by the UMGCCC FCSR's Cytometry In R course. This includes IRC, the mailing lists, the issue tracker, DSF events, and any other forums created by the project team which the community uses for communication. In addition, violations of this code outside these spaces may affect a person's ability to participate within them. - -If you believe someone is violating the code of conduct, we ask that you report it by emailing [flowcore@som.umaryland.edu](mailto:flowcore@som.umaryland.edu). - -- **Be friendly and patient.** -- **Be welcoming.** We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. -- **Be considerate.** Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. -- **Be respectful.** Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Members of the Cytometry In R community should be respectful when dealing with other members as well as with people outside the Cytometry In R community. -- **Be careful in the words that you choose.** We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. This includes, but is not limited to: - - Violent threats or language directed against another person. - - Discriminatory jokes and language. - - Posting sexually explicit or violent material. - - Posting (or threatening to post) other people's personally identifying information ("doxing"). - - Personal insults, especially those using racist or sexist terms. - - Unwelcome sexual attention. - - Advocating for, or encouraging, any of the above behavior. - - Repeated harassment of others. In general, if someone asks you to stop, then stop. -- **When we disagree, try to understand why.** Disagreements, both social and technical, happen all the time and Cytometry In R is no exception. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of Cytometry In R comes from its varied community, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. - -Original text courtesy of the [Speak Up! project](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html). - -## Questions? - -If you have any questions, feel free to [contact us](mailto:flowcore@som.umaryland.edu). +# Cytometry In R Code of Conduct + +Like the flow cytometry community as a whole, the Cytometry In R team and community is made up of a mixture of professionals and volunteers from all over the world, working on every aspect of the mission - including mentorship, teaching, and connecting people. + +Diversity is one of our huge strengths, but it can also lead to communication issues and unhappiness. To that end, we have a few ground rules that we ask people to adhere to. This code applies equally to founders, mentors and those seeking help and guidance. + +This isn’t an exhaustive list of things that you can’t do. Rather, take it in the spirit in which it’s intended - a guide to make it easier to enrich all of us and the technical communities in which we participate. + +This code of conduct applies to all spaces managed by the UMGCCC FCSR's Cytometry In R course. This includes IRC, the mailing lists, the issue tracker, DSF events, and any other forums created by the project team which the community uses for communication. In addition, violations of this code outside these spaces may affect a person's ability to participate within them. + +If you believe someone is violating the code of conduct, we ask that you report it by emailing [flowcore@som.umaryland.edu](mailto:flowcore@som.umaryland.edu). + +- **Be friendly and patient.** +- **Be welcoming.** We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. +- **Be considerate.** Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. +- **Be respectful.** Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Members of the Cytometry In R community should be respectful when dealing with other members as well as with people outside the Cytometry In R community. +- **Be careful in the words that you choose.** We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. This includes, but is not limited to: + - Violent threats or language directed against another person. + - Discriminatory jokes and language. + - Posting sexually explicit or violent material. + - Posting (or threatening to post) other people's personally identifying information ("doxing"). + - Personal insults, especially those using racist or sexist terms. + - Unwelcome sexual attention. + - Advocating for, or encouraging, any of the above behavior. + - Repeated harassment of others. In general, if someone asks you to stop, then stop. +- **When we disagree, try to understand why.** Disagreements, both social and technical, happen all the time and Cytometry In R is no exception. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of Cytometry In R comes from its varied community, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. + +Original text courtesy of the [Speak Up! project](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html). + +## Questions? + +If you have any questions, feel free to [contact us](mailto:flowcore@som.umaryland.edu). diff --git a/COMMIT_EDITMSG b/COMMIT_EDITMSG new file mode 100644 index 0000000..f74918f --- /dev/null +++ b/COMMIT_EDITMSG @@ -0,0 +1,188 @@ +Macbook sync + +# Conflicts: +# _quarto.yml +# docs/Schedule.html +# docs/course/00_BonusContent/Immport/images/index.html +# docs/course/00_BonusContent/index.html +# docs/course/00_Floreada/index.html +# docs/course/00_Git/index.html +# docs/course/00_GitHub/index.html +# docs/course/00_Homeworks/index.html +# docs/course/00_Positron/index.html +# docs/course/00_Quarto/index.html +# docs/course/00_WorkstationSetup/Linux.html +# docs/course/00_WorkstationSetup/MacOS.html +# docs/course/00_WorkstationSetup/Windows.html +# docs/course/00_WorkstationSetup/index.html +# docs/course/01_InstallingRPackages/index.html +# docs/course/02_FilePaths/Downsampler.html +# docs/course/02_FilePaths/index.html +# docs/course/03_InsideFCSFile/index.html +# docs/course/03_InsideFCSFile/slides.html +# docs/course/index.html +# docs/search.json + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# +# interactive rebase in progress; onto 784485f +# Last command done (1 command done): +# pick 052910a # Macbook sync +# Next command to do (1 remaining command): +# pick 97ef5b8 # macbook sync +# You are currently rebasing branch 'main' on '784485f'. +# +# Changes to be committed: +# modified: .gitignore +# modified: .vscode/settings.json +# modified: CODE_OF_CONDUCT.md +# modified: CONTRIBUTING.md +# modified: ExistingResources.qmd +# modified: LICENSE +# modified: LICENSE_CC-BY-SA +# modified: PackageWalkthroughs.qmd +# modified: README.md +# modified: Schedule.qmd +# modified: _quarto.yml +# modified: course/00_BonusContent/Immport/images/index.qmd +# modified: course/00_BonusContent/index.qmd +# modified: course/00_Floreada/data/workspace.wsp +# modified: course/00_Floreada/data/workspace.xml +# modified: course/00_Floreada/index.qmd +# modified: course/00_Floreada/slides.qmd +# modified: course/00_Git/index.qmd +# modified: course/00_Git/slides.qmd +# modified: course/00_GitHub/index.qmd +# modified: course/00_GitHub/slides.qmd +# modified: course/00_Homeworks/index.qmd +# modified: course/00_Homeworks/slides.qmd +# modified: course/00_Positron/index.qmd +# modified: course/00_Positron/slides.qmd +# modified: course/00_Quarto/index.qmd +# modified: course/00_Quarto/slides.qmd +# modified: course/00_WorkstationSetup/Linux.qmd +# modified: course/00_WorkstationSetup/LinuxSlides.qmd +# modified: course/00_WorkstationSetup/MacOS.qmd +# modified: course/00_WorkstationSetup/MacOSSlides.qmd +# modified: course/00_WorkstationSetup/Windows.qmd +# modified: course/00_WorkstationSetup/WindowsSlides.qmd +# modified: course/00_WorkstationSetup/index.qmd +# modified: course/01_InstallingRPackages/homeworks/README.md +# modified: course/01_InstallingRPackages/index.qmd +# modified: course/01_InstallingRPackages/slides.qmd +# modified: course/01_InstallingRPackages/slides_inperson.qmd +# modified: course/02_FilePaths/Downsampler.qmd +# modified: course/02_FilePaths/homeworks/README.md +# modified: course/02_FilePaths/homeworks/claude-chew/LICENSE +# modified: course/02_FilePaths/homeworks/claude-chew/README.md +# modified: course/02_FilePaths/homeworks/claude-chew/Week2Homework.qmd +# modified: course/02_FilePaths/index.qmd +# modified: course/02_FilePaths/slides.qmd +# modified: course/03_InsideFCSFile/data/BioconductorDownloads.csv +# modified: course/03_InsideFCSFile/data/BioconductorFlow.csv +# modified: course/03_InsideFCSFile/homeworks/README.md +# modified: course/03_InsideFCSFile/homeworks/claude-chew/.vscode/settings.json +# modified: course/03_InsideFCSFile/homeworks/claude-chew/Week3Class.qmd +# modified: course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.qmd +# modified: course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorDownloads.csv +# modified: course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorFlow.csv +# modified: course/03_InsideFCSFile/images/BioconductorInkscape.svg +# modified: course/03_InsideFCSFile/index.qmd +# modified: course/03_InsideFCSFile/slides.qmd +# modified: course/index.qmd +# modified: docs/ExistingResources.html +# modified: docs/PackageWalkthroughs.html +# modified: docs/course/00_Floreada/slides.html +# modified: docs/course/00_Git/slides.html +# modified: docs/course/00_GitHub/slides.html +# modified: docs/course/00_Homeworks/slides.html +# modified: docs/course/00_Positron/slides.html +# modified: docs/course/00_Quarto/slides.html +# modified: docs/course/00_WorkstationSetup/LinuxSlides.html +# modified: docs/course/00_WorkstationSetup/MacOSSlides.html +# modified: docs/course/00_WorkstationSetup/WindowsSlides.html +# modified: docs/course/01_InstallingRPackages/slides.html +# modified: docs/course/01_InstallingRPackages/slides_inperson.html +# modified: docs/course/02_FilePaths/slides.html +# modified: docs/images/Bioconductor.svg +# modified: docs/index.html +# modified: docs/site_libs/bootstrap/bootstrap-8eaec6b9941db0f18eecf13b95a46332.min.css +# modified: docs/site_libs/bootstrap/bootstrap-icons.css +# modified: docs/site_libs/bootstrap/bootstrap.min.js +# modified: docs/site_libs/clipboard/clipboard.min.js +# modified: docs/site_libs/crosstalk-1.2.2/css/crosstalk.min.css +# modified: docs/site_libs/crosstalk-1.2.2/js/crosstalk.js +# modified: docs/site_libs/crosstalk-1.2.2/js/crosstalk.js.map +# modified: docs/site_libs/crosstalk-1.2.2/js/crosstalk.min.js +# modified: docs/site_libs/crosstalk-1.2.2/scss/crosstalk.scss +# modified: docs/site_libs/htmltools-fill-0.5.9/fill.css +# modified: docs/site_libs/htmlwidgets-1.6.4/htmlwidgets.js +# modified: docs/site_libs/jquery-3.5.1/jquery-AUTHORS.txt +# modified: docs/site_libs/jquery-3.5.1/jquery.js +# modified: docs/site_libs/jquery-3.5.1/jquery.min.js +# modified: docs/site_libs/plotly-binding-4.12.0/plotly.js +# modified: docs/site_libs/plotly-htmlwidgets-css-2.25.2/plotly-htmlwidgets.css +# modified: docs/site_libs/plotly-main-2.25.2/plotly-latest.min.js +# modified: docs/site_libs/quarto-html/anchor.min.js +# modified: docs/site_libs/quarto-html/popper.min.js +# modified: docs/site_libs/quarto-html/quarto-syntax-highlighting-37eea08aefeeee20ff55810ff984fec1.css +# modified: docs/site_libs/quarto-html/quarto.js +# modified: docs/site_libs/quarto-html/tabby.min.js +# modified: docs/site_libs/quarto-html/tabsets/tabsets.js +# modified: docs/site_libs/quarto-html/tippy.umd.min.js +# modified: docs/site_libs/quarto-nav/headroom.min.js +# modified: docs/site_libs/quarto-nav/quarto-nav.js +# modified: docs/site_libs/quarto-search/autocomplete.umd.js +# modified: docs/site_libs/quarto-search/fuse.min.js +# modified: docs/site_libs/quarto-search/quarto-search.js +# modified: docs/site_libs/revealjs/dist/reset.css +# modified: docs/site_libs/revealjs/dist/reveal.css +# modified: docs/site_libs/revealjs/dist/reveal.esm.js +# modified: docs/site_libs/revealjs/dist/reveal.js +# modified: docs/site_libs/revealjs/dist/theme/fonts/league-gothic/LICENSE +# modified: docs/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css +# modified: docs/site_libs/revealjs/dist/theme/fonts/source-sans-pro/LICENSE +# modified: docs/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css +# modified: docs/site_libs/revealjs/dist/theme/quarto-f563837468303362081e247dddd440d0.css +# modified: docs/site_libs/revealjs/plugin/highlight/highlight.esm.js +# modified: docs/site_libs/revealjs/plugin/highlight/highlight.js +# modified: docs/site_libs/revealjs/plugin/highlight/monokai.css +# modified: docs/site_libs/revealjs/plugin/highlight/plugin.js +# modified: docs/site_libs/revealjs/plugin/highlight/zenburn.css +# modified: docs/site_libs/revealjs/plugin/markdown/markdown.esm.js +# modified: docs/site_libs/revealjs/plugin/markdown/markdown.js +# modified: docs/site_libs/revealjs/plugin/markdown/plugin.js +# modified: docs/site_libs/revealjs/plugin/math/katex.js +# modified: docs/site_libs/revealjs/plugin/math/math.esm.js +# modified: docs/site_libs/revealjs/plugin/math/math.js +# modified: docs/site_libs/revealjs/plugin/math/mathjax2.js +# modified: docs/site_libs/revealjs/plugin/math/mathjax3.js +# modified: docs/site_libs/revealjs/plugin/math/plugin.js +# modified: docs/site_libs/revealjs/plugin/notes/notes.esm.js +# modified: docs/site_libs/revealjs/plugin/notes/notes.js +# modified: docs/site_libs/revealjs/plugin/notes/plugin.js +# modified: docs/site_libs/revealjs/plugin/notes/speaker-view.html +# modified: docs/site_libs/revealjs/plugin/pdf-export/pdfexport.js +# modified: docs/site_libs/revealjs/plugin/pdf-export/plugin.yml +# modified: docs/site_libs/revealjs/plugin/quarto-line-highlight/line-highlight.css +# modified: docs/site_libs/revealjs/plugin/quarto-line-highlight/line-highlight.js +# modified: docs/site_libs/revealjs/plugin/quarto-line-highlight/plugin.yml +# modified: docs/site_libs/revealjs/plugin/quarto-support/footer.css +# modified: docs/site_libs/revealjs/plugin/quarto-support/plugin.yml +# modified: docs/site_libs/revealjs/plugin/quarto-support/support.js +# modified: docs/site_libs/revealjs/plugin/reveal-menu/menu.css +# modified: docs/site_libs/revealjs/plugin/reveal-menu/menu.js +# modified: docs/site_libs/revealjs/plugin/reveal-menu/plugin.yml +# modified: docs/site_libs/revealjs/plugin/reveal-menu/quarto-menu.css +# modified: docs/site_libs/revealjs/plugin/reveal-menu/quarto-menu.js +# modified: docs/site_libs/revealjs/plugin/search/plugin.js +# modified: docs/site_libs/revealjs/plugin/search/search.esm.js +# modified: docs/site_libs/revealjs/plugin/search/search.js +# modified: docs/site_libs/revealjs/plugin/zoom/plugin.js +# modified: docs/site_libs/revealjs/plugin/zoom/zoom.esm.js +# modified: docs/site_libs/revealjs/plugin/zoom/zoom.js +# modified: images/Bioconductor.svg +# modified: index.qmd +# modified: styles.scss +# diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1eff111..177e13a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,32 +1,32 @@ -We gladly accept community contributions to make the project better. These typically take the form of improvements to either the text, code or both. - -# License - -In our commitment to open-science and open-source, the teaching materials for our mini-course are licensed under the CC-BY-SA license, while thc ode is licensed under the copyleft AGPL3-0 license. All community contributions to the project will fall under the same licenses. We ask that any contributions be your own words and code, and not verbatum copy-and-paste from a LLM. - -# Sign Your Work - -The _sign-off_ is a simple line at the end of the message for a commit. All commits in your pull request need to be signed. Your signature certifies that you wrote the patch or otherwise have the right to contribute the material (see [Developer Certificate of Origin](https://developercertificate.org)): - -``` -This is my commit message - -Signed-off-by: David Rach -``` - -Git has a [`-s`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---signoff) command line option to append this automatically to your commit message: - -```bash -$ git commit -s -m "This is my commit message" -``` - -# Pull Request - -1) Open an issue, mention what you want to do. That way we can avoid misplaced effort of multiple people tackling the same issue separately. -2) Fork our repository. -3) Create your own branch. -4) Make your edits, keeping commit changes restricted to individual files. -5) Sign all your commits. -6) When ready, open a pull request from your branch to main. -7) We will reply with comments, update with any edits. -8) After review, we will merge or suggest additional changes. +We gladly accept community contributions to make the project better. These typically take the form of improvements to either the text, code or both. + +# License + +In our commitment to open-science and open-source, the teaching materials for our mini-course are licensed under the CC-BY-SA license, while thc ode is licensed under the copyleft AGPL3-0 license. All community contributions to the project will fall under the same licenses. We ask that any contributions be your own words and code, and not verbatum copy-and-paste from a LLM. + +# Sign Your Work + +The _sign-off_ is a simple line at the end of the message for a commit. All commits in your pull request need to be signed. Your signature certifies that you wrote the patch or otherwise have the right to contribute the material (see [Developer Certificate of Origin](https://developercertificate.org)): + +``` +This is my commit message + +Signed-off-by: David Rach +``` + +Git has a [`-s`](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---signoff) command line option to append this automatically to your commit message: + +```bash +$ git commit -s -m "This is my commit message" +``` + +# Pull Request + +1) Open an issue, mention what you want to do. That way we can avoid misplaced effort of multiple people tackling the same issue separately. +2) Fork our repository. +3) Create your own branch. +4) Make your edits, keeping commit changes restricted to individual files. +5) Sign all your commits. +6) When ready, open a pull request from your branch to main. +7) We will reply with comments, update with any edits. +8) After review, we will merge or suggest additional changes. diff --git a/ExistingResources.qmd b/ExistingResources.qmd index 22b65a5..67d6d3c 100644 --- a/ExistingResources.qmd +++ b/ExistingResources.qmd @@ -1,216 +1,216 @@ ---- -title: "Existing Resources" -format: html -toc: TRUE -toc-location: right -sidebar: false ---- - -![](images/WebsiteBanner.png) - -
-[![AGPL-3.0][agpl3-shield]][agpl3] -[![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] -
- -We are not the first "Cytometry in R" course, nor will we be the last. This page is linking to the already existant online Cytometry in R resources that we have encountered and benefited from during our own learning journey. May they prove useful to you as you progress your way through yours! - -
- ---- - -# Christopher Hall - Flow Cytometry Data Analysis in R - -[Cytometry-R-Scripts: R scripts to help with your flow cytometry analysis](https://github.com/hally166/Cytometry-R-scripts) - -[R_flowcytometry_course: The files and presentation from the Cytometry Core Facility flow cytometry data analysis course in R](https://github.com/hally166/R_flowcytometry_course) - -### Installation and Loading Data - -[(1) Flow Cytometry Data Analysis in R - Installation and Loading Data](https://youtu.be/2INqQNMNaV0?si=h_3Xa3bIBr0E9199) - - - -### Compensation, Cleaning, Transformation, Visualization - -[(2) Flow Cytometry Data Analysis in R: compensation, cleaning, transformation, visualization](https://www.youtube.com/watch?v=WWa7dwwiLvI&list=PLonl5DIJ0E5_nLR2iF9bILHB1W7a5LGqO&index=3) - - - -### Gating with flowWorkspace - -[(3) Flow Cytometry Data Analysis in R: gating with flowWorkspace](https://youtu.be/ijHOGHP82EY?si=87OB8t8wynJNnTf3) - - - - -### Visualization - -[(4) Flow Cytometry Data Analysis in R: Visualisation](https://youtu.be/Y7_ux9Py3Vg?si=2wG5WmI8n3IBCyHD) - - - -
- ---- - - -# Ozette Technologies - BioC 2023 Workshop - -Workshop given at the Bioc2023 conference, authored by Arpan Neupane and Andrew McDavid. - -[Workshop: Reproducible and programmatic analysis of flow cytometry experiments with the cytoverse](https://youtu.be/_8x-prIxJgw?si=Tm-QoBQ3qc568xXD) - - - -
- ---- - -# Pritam Kumar Panda - Flow Cytometry Data Analysis & Visualization in R using CytoExploreR - -[Flow-Cytometry-analysis-in-R](https://github.com/pritampanda15/Proteomics/tree/main/Flow-Cytometry-analysis-in-R-main) - -[CytoExploreR-Interactive-visualization](https://github.com/pritampanda15/Proteomics/tree/main/CytoExploreR-Interactive-visualization-main) - -### Complete Guide - -[Flow Cytometry Data Analysis & Visualization in R using CytoExploreR: Complete Guide](https://youtu.be/AvIvRorrh8c?si=MVViua5fSBrahtzv) - - - -
- ---- - - -# Bioinformatics DotCa - Introduction to Flow Cytometry in R - -### Introduction to Flow Cytometry in R - -[Introduction to Flow Cytometry in R](https://youtu.be/0_dN8VKhOJ0?si=Mn7UB0Gps5twqAqK) - - - -### Exploring FCM Data in R - -[Exploring FCM Data in R](https://youtu.be/IE8X32HVA9I?si=0xTVBGWanRele4WT) - - - -### Processing and Quality Assurance of FCM Data - -[Processing and Quality Assurance of FCM Data](https://youtu.be/OnAcZzBSc54?si=Z-RijMLvhvxqXvV2) - - - -### 1D Dynamic Gating - -[1D Dynamic Gating](https://youtu.be/Yd_IPMDFm4Y?si=9OikOeFnkEMCRURl) - - - -### Clustering and Additional FCM Tools - -[Clustering and Additional FCM Tools](https://youtu.be/xnvNCsu56Vo?si=botz0swIm31W5340) - - - -# Tulika Rai - Learn Innovatively With Me - -### flowAI Flow Cytometry Data Cleaning using R - -[flowAI Flow Cytometry Data Cleaning using R: A Step-by-step Tutorial](https://youtu.be/PvB37SEe7lI?si=X3iYcGT7A3G603oP) - - - -### tSNE UMAP TRIMAP colorization or Transformation using R script - -[tSNE UMAP TRIMAP colorization or Transformation using R script ](https://youtu.be/l9dg4QUYSOM?si=gW218zzDqQEtjtpY) - - - -
- ---- - -# Givanna Putri - Introduction to Cytometry Data Analysis in R workshop - -[ACS 2021 Workshops - Introduction to Cytometry Data Analysis in R workshop](https://youtu.be/-0QrXgk_NRw?si=GqcjU-_MQ3UvYwvI) - - - -
- ---- - -# Timothy Keyes - - -[{tidytof}: Predicting Patient Outcomes from Single-cell Data using Tidy Data Principles](https://youtu.be/5NhpC836aSc?si=QqoeW31cQcHFzu5W) - - - -
- ---- - -# Ryan Duggan - Cytometry on Air - -[Cytometry on Air: Analyzing Flow Cytometry Data in R](https://www.youtube.com/live/_B7mo6dB3BU?si=eW20X4YWgaCoYnfw) Presentation by TJ Chen and Greg Finak, - - - -
- ---- - - -# Guillaume Beyrend - Learn Cytometry - -[Learn Cytometry](https://learncytometry.com/videos/) Originally appeared to have been paywalled, doesn't currently appear to be the case. - -
- ---- - -# Hong Qin - flow analysis in R - -### Flow Analysis in R - -[flow analysis in R, bio125, Spring 2015](https://youtu.be/r7Mf6joCNzM?si=5j9Fy8fn6d7o0Z-u) - - - -### Flow Cytometer Data Analysis - -[BIO233 demo, flow cytometer data analysis, simple example](https://youtu.be/BN5Ldu1AFgk?si=FV2K7jJGe9H6na08) - - - - -
- ---- - -# Swayam Prabha - Flow cytometry data analysis in R/Bioconductor - -[Lecture 15 : Flow cytometry data analysis in R/Bioconductor](https://youtu.be/g-VUT3riwOM?si=SlX88J3HpsjYaqFI) - - - -
- ---- - - -
-[![AGPL-3.0][agpl3-image]][agpl3] -[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] -
- -[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ -[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png -[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg -[agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html -[agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png +--- +title: "Existing Resources" +format: html +toc: TRUE +toc-location: right +sidebar: false +--- + +![](images/WebsiteBanner.png) + +
+[![AGPL-3.0][agpl3-shield]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] +
+ +We are not the first "Cytometry in R" course, nor will we be the last. This page is linking to the already existant online Cytometry in R resources that we have encountered and benefited from during our own learning journey. May they prove useful to you as you progress your way through yours! + +
+ +--- + +# Christopher Hall - Flow Cytometry Data Analysis in R + +[Cytometry-R-Scripts: R scripts to help with your flow cytometry analysis](https://github.com/hally166/Cytometry-R-scripts) + +[R_flowcytometry_course: The files and presentation from the Cytometry Core Facility flow cytometry data analysis course in R](https://github.com/hally166/R_flowcytometry_course) + +### Installation and Loading Data + +[(1) Flow Cytometry Data Analysis in R - Installation and Loading Data](https://youtu.be/2INqQNMNaV0?si=h_3Xa3bIBr0E9199) + + + +### Compensation, Cleaning, Transformation, Visualization + +[(2) Flow Cytometry Data Analysis in R: compensation, cleaning, transformation, visualization](https://www.youtube.com/watch?v=WWa7dwwiLvI&list=PLonl5DIJ0E5_nLR2iF9bILHB1W7a5LGqO&index=3) + + + +### Gating with flowWorkspace + +[(3) Flow Cytometry Data Analysis in R: gating with flowWorkspace](https://youtu.be/ijHOGHP82EY?si=87OB8t8wynJNnTf3) + + + + +### Visualization + +[(4) Flow Cytometry Data Analysis in R: Visualisation](https://youtu.be/Y7_ux9Py3Vg?si=2wG5WmI8n3IBCyHD) + + + +
+ +--- + + +# Ozette Technologies - BioC 2023 Workshop + +Workshop given at the Bioc2023 conference, authored by Arpan Neupane and Andrew McDavid. + +[Workshop: Reproducible and programmatic analysis of flow cytometry experiments with the cytoverse](https://youtu.be/_8x-prIxJgw?si=Tm-QoBQ3qc568xXD) + + + +
+ +--- + +# Pritam Kumar Panda - Flow Cytometry Data Analysis & Visualization in R using CytoExploreR + +[Flow-Cytometry-analysis-in-R](https://github.com/pritampanda15/Proteomics/tree/main/Flow-Cytometry-analysis-in-R-main) + +[CytoExploreR-Interactive-visualization](https://github.com/pritampanda15/Proteomics/tree/main/CytoExploreR-Interactive-visualization-main) + +### Complete Guide + +[Flow Cytometry Data Analysis & Visualization in R using CytoExploreR: Complete Guide](https://youtu.be/AvIvRorrh8c?si=MVViua5fSBrahtzv) + + + +
+ +--- + + +# Bioinformatics DotCa - Introduction to Flow Cytometry in R + +### Introduction to Flow Cytometry in R + +[Introduction to Flow Cytometry in R](https://youtu.be/0_dN8VKhOJ0?si=Mn7UB0Gps5twqAqK) + + + +### Exploring FCM Data in R + +[Exploring FCM Data in R](https://youtu.be/IE8X32HVA9I?si=0xTVBGWanRele4WT) + + + +### Processing and Quality Assurance of FCM Data + +[Processing and Quality Assurance of FCM Data](https://youtu.be/OnAcZzBSc54?si=Z-RijMLvhvxqXvV2) + + + +### 1D Dynamic Gating + +[1D Dynamic Gating](https://youtu.be/Yd_IPMDFm4Y?si=9OikOeFnkEMCRURl) + + + +### Clustering and Additional FCM Tools + +[Clustering and Additional FCM Tools](https://youtu.be/xnvNCsu56Vo?si=botz0swIm31W5340) + + + +# Tulika Rai - Learn Innovatively With Me + +### flowAI Flow Cytometry Data Cleaning using R + +[flowAI Flow Cytometry Data Cleaning using R: A Step-by-step Tutorial](https://youtu.be/PvB37SEe7lI?si=X3iYcGT7A3G603oP) + + + +### tSNE UMAP TRIMAP colorization or Transformation using R script + +[tSNE UMAP TRIMAP colorization or Transformation using R script ](https://youtu.be/l9dg4QUYSOM?si=gW218zzDqQEtjtpY) + + + +
+ +--- + +# Givanna Putri - Introduction to Cytometry Data Analysis in R workshop + +[ACS 2021 Workshops - Introduction to Cytometry Data Analysis in R workshop](https://youtu.be/-0QrXgk_NRw?si=GqcjU-_MQ3UvYwvI) + + + +
+ +--- + +# Timothy Keyes - + +[{tidytof}: Predicting Patient Outcomes from Single-cell Data using Tidy Data Principles](https://youtu.be/5NhpC836aSc?si=QqoeW31cQcHFzu5W) + + + +
+ +--- + +# Ryan Duggan - Cytometry on Air + +[Cytometry on Air: Analyzing Flow Cytometry Data in R](https://www.youtube.com/live/_B7mo6dB3BU?si=eW20X4YWgaCoYnfw) Presentation by TJ Chen and Greg Finak, + + + +
+ +--- + + +# Guillaume Beyrend - Learn Cytometry + +[Learn Cytometry](https://learncytometry.com/videos/) Originally appeared to have been paywalled, doesn't currently appear to be the case. + +
+ +--- + +# Hong Qin - flow analysis in R + +### Flow Analysis in R + +[flow analysis in R, bio125, Spring 2015](https://youtu.be/r7Mf6joCNzM?si=5j9Fy8fn6d7o0Z-u) + + + +### Flow Cytometer Data Analysis + +[BIO233 demo, flow cytometer data analysis, simple example](https://youtu.be/BN5Ldu1AFgk?si=FV2K7jJGe9H6na08) + + + + +
+ +--- + +# Swayam Prabha - Flow cytometry data analysis in R/Bioconductor + +[Lecture 15 : Flow cytometry data analysis in R/Bioconductor](https://youtu.be/g-VUT3riwOM?si=SlX88J3HpsjYaqFI) + + + +
+ +--- + + +
+[![AGPL-3.0][agpl3-image]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] +
+ +[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ +[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png +[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg +[agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html +[agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png [agpl3-shield]: https://img.shields.io/badge/license-AGPLv3-blue \ No newline at end of file diff --git a/LICENSE b/LICENSE index 0ad25db..ada1a81 100644 --- a/LICENSE +++ b/LICENSE @@ -1,661 +1,661 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/LICENSE_CC-BY-SA b/LICENSE_CC-BY-SA index 3b7b82d..497481e 100644 --- a/LICENSE_CC-BY-SA +++ b/LICENSE_CC-BY-SA @@ -1,427 +1,427 @@ -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/PackageWalkthroughs.qmd b/PackageWalkthroughs.qmd index 9819141..0a58ac6 100644 --- a/PackageWalkthroughs.qmd +++ b/PackageWalkthroughs.qmd @@ -1,179 +1,179 @@ ---- -title: "Package Walkthroughs" -format: html -toc: TRUE -toc-location: right -sidebar: false ---- - -![](images/WebsiteBanner.png) - -
-[![AGPL-3.0][agpl3-shield]][agpl3] -[![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] -
- - -# Background - -The purpose of this page is to host the Vignette writing challenge entries. There are a substantial number of R packages on both Bioconductor and GitHub that we will not be able to get to during the course. My goal for the off-weeks is to have the class assist in navigating through the existing vignettes/articles for each package, and write up a basic .qmd file to help anyone trying to use these packages have a simpler learning curve in doing so than they would have otherwise. - -# Bioconductor - -## flowCore - -## cytolib - -## flowWorkspace - -## ncdfFlow - -## flowViz - -## FlowSOM - -## ggcyto - -## openCyto - -## quantiseqr - -## flowStats - -## CytoML - -## CATALYST - -## flowAI - -## diffcyt - -## flowDensity - -## flowMeans - -## PeacoQC - -## flowFP - -## flowClean - -## flowPeaks - -## COMPASS - -## SamSPECTRAL - -## flowVS - -## cydar - -## flowMerge - -## flowTrans - -## distinct - -## flowCut - -## flowMatch - -## flowBeads - -## flowTime - -## sccomp - -## flowCHIC - -## flowSpecs - -## DepecheR - -## treekoR - -## flowBin - -## MetaCyto - -## immunoClust - -## scDataviz - -## cytoMEM - -## flowPloidy - -## plotGrouper - -## CytoDx - -## Sconify - -## flowPlots - -## GateFinder - -## flowGate - -## flowGraph - -## infinityFlow - -## cyanoFilter - -## optimalFlow - -## CytoGLMM - -## scifer - -## cytoKernel - -## CytoPipeline - -## censcyt - -## flowCyBar - -## reconsi - -## MACSQuantifyR - -## CytoMDS - -## CytoPipelineGUI - -## MAPFX - -## spillR - -## tidyFlowCore - -## CyTOFpower - -## tidytof - -## SuperCellCyto - -# GitHub - -## autospill - -## autospectral - -## flowMagic - - -
-[![AGPL-3.0][agpl3-image]][agpl3] -[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] -
- -[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ -[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png -[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg -[agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html -[agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png -[agpl3-shield]: https://img.shields.io/badge/license-AGPLv3-blue - +--- +title: "Package Walkthroughs" +format: html +toc: TRUE +toc-location: right +sidebar: false +--- + +![](images/WebsiteBanner.png) + +
+[![AGPL-3.0][agpl3-shield]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] +
+ + +# Background + +The purpose of this page is to host the Vignette writing challenge entries. There are a substantial number of R packages on both Bioconductor and GitHub that we will not be able to get to during the course. My goal for the off-weeks is to have the class assist in navigating through the existing vignettes/articles for each package, and write up a basic .qmd file to help anyone trying to use these packages have a simpler learning curve in doing so than they would have otherwise. + +# Bioconductor + +## flowCore + +## cytolib + +## flowWorkspace + +## ncdfFlow + +## flowViz + +## FlowSOM + +## ggcyto + +## openCyto + +## quantiseqr + +## flowStats + +## CytoML + +## CATALYST + +## flowAI + +## diffcyt + +## flowDensity + +## flowMeans + +## PeacoQC + +## flowFP + +## flowClean + +## flowPeaks + +## COMPASS + +## SamSPECTRAL + +## flowVS + +## cydar + +## flowMerge + +## flowTrans + +## distinct + +## flowCut + +## flowMatch + +## flowBeads + +## flowTime + +## sccomp + +## flowCHIC + +## flowSpecs + +## DepecheR + +## treekoR + +## flowBin + +## MetaCyto + +## immunoClust + +## scDataviz + +## cytoMEM + +## flowPloidy + +## plotGrouper + +## CytoDx + +## Sconify + +## flowPlots + +## GateFinder + +## flowGate + +## flowGraph + +## infinityFlow + +## cyanoFilter + +## optimalFlow + +## CytoGLMM + +## scifer + +## cytoKernel + +## CytoPipeline + +## censcyt + +## flowCyBar + +## reconsi + +## MACSQuantifyR + +## CytoMDS + +## CytoPipelineGUI + +## MAPFX + +## spillR + +## tidyFlowCore + +## CyTOFpower + +## tidytof + +## SuperCellCyto + +# GitHub + +## autospill + +## autospectral + +## flowMagic + + +
+[![AGPL-3.0][agpl3-image]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] +
+ +[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ +[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png +[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg +[agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html +[agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png +[agpl3-shield]: https://img.shields.io/badge/license-AGPLv3-blue + diff --git a/README.md b/README.md index 48d8243..69261ff 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,44 @@ +<<<<<<< HEAD +![](images/WebsiteBanner.png) + +Cytometry in R is a free virtual mini-course being organized by the [Flow Cytometry Shared Resource](https://www.medschool.umaryland.edu/cibr/core/umgccc_flow/) Core at the [University of Maryland's Greenebaum Comprehensive Cancer Center](https://www.umms.org/umgccc). This course is a passion project arising from our desire to contribute back to the community. + +We are excited that so many individuals worldwide have chosen to take part, and we look forward to helping you get started on your own learning journeys. + +![](/images/WorldwideSignups.png){width=100%} + +Click here to go to our [Course Website](https://umgcccfcsr.github.io/CytometryInR) + +# Participating + +The course will start the first week of February, with Week #1 resources being released on Sunday, February 1st at 2200 EST (Monday 0300 GMT+0). See below for additional details. + +## Resources + +The pre-course learning materials are now [available](https://umgcccfcsr.github.io/CytometryInR/course/00_GitHub/) , providing walkthroughs of how to set up your workstations with the required software, and exercises to help you become more familiar with the various teaching and coding resources we will be using throughout the course. + +Narrated versions of the walk through materials will be available starting next week via [YouTube](https://www.youtube.com/@CytometryInR) + + +## In-Person (Baltimore) + +For those joining us in person, the class is being offered on Monday, Tuesday and Thursday from **4-5 pm EST** in Bressler Research Building Room 7-035. We invite you to make whichever session best fits your schedule. Monitors to plug your laptops in will be available on a first come, first served basis. These in-person sessions will not be recorded, but with the smaller class size you will have our undivided attention should you have any questions. + +## Virtual (Worldwide) + +For those joining us virtually, we will have three separate livestreams throughout the week on [YouTube](https://www.youtube.com/@CytometryInR). These will be offered on: + +- Tuesday 2200 EST (Wednesday 0300 GMT+0) +- Wednesday 1600 EST (Wednesday 2100 GMT+0) +- Thursday 1000 EST (Thursday 1500 GMT+0) + +All three livestreams will be recorded and available on YouTube immediately afterwards. + +## Discussion Forum + +We will be using the Cytometry in R [Discussions page](https://github.com/UMGCCCFCSR/CytometryInR/discussions) as a community forum, and a place to ask questions, celebrate wins, and provide feedback. After creating a a [GitHub](https://umgcccfcsr.github.io/CytometryInR/course/00_GitHub/) account, pleae go introduce yourself. +For additional details, please visit our [website](https://umgcccfcsr.github.io/CytometryInR/) +======= ![](images/WebsiteBanner.png) Cytometry in R is a free virtual mini-course being organized by the [Flow Cytometry Shared Resource](https://www.medschool.umaryland.edu/cibr/core/umgccc_flow/) Core at the [University of Maryland's Greenebaum Comprehensive Cancer Center](https://www.umms.org/umgccc). This course is a passion project arising from our desire to contribute back to the community. @@ -31,3 +72,4 @@ All three livestreams will be recorded and available on YouTube immediately afte We will be using the Cytometry in R [Discussions page](https://github.com/UMGCCCFCSR/CytometryInR/discussions) as a community forum, and a place to ask questions, celebrate wins, and provide feedback. After creating a a [GitHub](https://umgcccfcsr.github.io/CytometryInR/course/00_GitHub/) account, pleae go introduce yourself. For additional details, please visit our [website](https://umgcccfcsr.github.io/CytometryInR/) +>>>>>>> 23a81a59a64966e782d820f6b60f087d577c3b25 diff --git a/Schedule.qmd b/Schedule.qmd index cde0d6d..80d98d2 100644 --- a/Schedule.qmd +++ b/Schedule.qmd @@ -1,3 +1,342 @@ +<<<<<<< HEAD +--- +format: html +toc: TRUE +toc-location: right +toc-depth: 4 +toc-expand: true +sidebar: false +--- +![](images/WebsiteBanner.png) + +
+[![AGPL-3.0][agpl3-shield]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa] +
+ +### Cytometry in R: A Course for Beginners + +Cytometry in R is a free virtual mini-course being organized by the [Flow Cytometry Shared Resource](https://www.medschool.umaryland.edu/cibr/core/umgccc_flow/) core at the University of Maryland's [Greenebaum Comprehensive Cancer Center](https://www.umms.org/umgccc). This course is a passion project arising from our desire to contribute back to the community. We are excited that you have chosen to take part and look forward to helping you get started on your own learning journey. + +If you did not complete the original interest form, and would like to be added to our mailing list, please complete the form [here](https://docs.google.com/forms/d/e/1FAIpQLScPK4V_WNSgQvZNq7aIHpoiX8pi3kiuCfI0Tp7hQkVJS3HPtQ/viewform?usp=publish-editor) + +The pre-course learning materials are now [available](/course/00_GitHub/index.qmd) via the Course tab. They consist of walkthroughs of how to set up your workstations with the required software, and exercises to help you become more familiar with the various teaching and coding resources we will be using throughout the course. + +
+ +### Pre-Course Walkthroughs + +![](images/01_GitHub.png){width=25%} + +[**Week 0: January 26, 2026**]{.underline} In these pre-course [walk-throughs](/course/00_GitHub/index.qmd), we ensure that everyone creates a [GitHub](https://github.com/) account, and has their computer properly set up with the required software (including [R](https://cran.rstudio.com/), [Positron](https://positron.posit.co/), and [Git](https://git-scm.com/)). We then start to build individual participants familiarity with the software infrastructure that they will be using throughout the rest of the course. + +
+
+ +### Installing R Packages + +![](images/PopUpLab.jpeg){width=25%} + +[**Week 1: February 2, 2026**]{.underline} During this [first session](/course/01_InstallingRPackages/index.qmd), we learn how to install R packages from the various repositories ([CRAN](https://cran.r-project.org/), [Bioconductor](https://www.bioconductor.org/), [GitHub](https://github.com/r-lib/remotes)), and how to troubleshoot the more typical errors that occur during this process. + +
+
+ +### File Paths + +![](https://www.medschool.umaryland.edu/media/som/offices-of-the-dean/information-services/screenshots/mappedrives02.png){width=50%} + +[**Week 2: February 9, 2026**]{.underline} For this [second session](/course/02_FilePaths/index.qmd), we focus on how to programmatically tell your computer where to locate your experimental files, introducing the concept of [file paths](https://ytakemon.github.io/2019-10-22-R-BCCRC/02-filedir/). We explore how the various operating systems (Linux, MacOS, Windows) specify their respective folders and files, and how to identify where you are currently within the directory. Our goal by the end of this session is to have walked you through how to figure out where an .fcs file of interest is stored, and convey to your computer where you want it copied/moved to, without encountering the common pitfalls. + +
+
+ +### Inside an .FCS file + +![](https://www.researchgate.net/profile/John-Drakos/publication/5575630/figure/fig1/AS:202978347753476@1425405217571/The-structure-of-FCS-files-The-HEADER-is-a-fixed-size-58-bytes-ASCII-encoded-segment.png){width=50%} + +[**Week 3: February 16, 2026**]{.underline} In the course of this [third session](/course/03_InsideFCSFile/index.qmd) we will slice into an .FCS file and find out what the individual components that make it up are. In the process, we will cover the concepts of main [data structures](http://adv-r.had.co.nz/Data-structures.html) within R (vectors, matrices, data.frames, list) and how to identify what we are working with. Additionally, we will explore how various cytometry softwares store their metadata variables under various keywords that can be useful to know about. + +
+
+ +### Introduction to the Tidyverse + +![](images/histograms.png){width=75%} + +[**Week 4: February 23, 2026**]{.underline} Within this session, we explore how the various [tidyverse](https://tidyverse.org/) packages can be utilized to reorganize rows and columns of data in ways that are useful for data analysis. We will primarily work with the MFI expression data we isolated from within the .fcs file in the previous session, identifying and isolating events that meet certain criterias. We introduce the concepts behind ["tidy"](https://vita.had.co.nz/papers/tidy-data.pdf) data and how it can improve our workflows. + +
+
+ +### Gating Sets + +![](images/GatingSets.png){width=75%} + +[**Week 5: March 2, 2026**]{.underline} As part of this session, we learn about the two main flow cytometry infrastructure packages in R we will be working with during the course, [flowcore](https://www.bioconductor.org/packages/release/bioc/vignettes/flowCore/inst/doc/HowTo-flowCore.pdf) and [flowWorkspace](https://www.bioconductor.org/packages/release/bioc/vignettes/flowWorkspace/inst/doc/flowWorkspace-Introduction.html). Throughout the session, we will compare how they differ in naming, memory usage, and accessing .fcs file metadata. We additionally explore how to add keywords to their respective metadata for use in filtering specimens of interest from the larger set of .fcs files. + +
+
+ +### Visualizing with ggplot2 + +![](images/StatsIFNg.png){width=50%} + +[**Week 6: March 9, 2026**]{.underline} During this session we provide an introduction to the [ggplot2](https://ggplot2.tidyverse.org/) package. We will take the datasets we have collected from the previous sessions and see how in varying in different arguments at the respective plot layers we can produce and customize many different forms of plots, focusing on both cytometry and statistics plots. We close out providing links to [additional helpful resources](https://youtu.be/_indbXPXUw8?si=iZRFHzWvBZg-wu_X) and highlight the [TidyTuesday](https://github.com/rfordatascience/tidytuesday) project. + +
+
+ +### Applying Transformations and Compensation + +![](images/subsetting.png){width=75%} + +[**Week 7: March 16, 2026**]{.underline} For this seventh session, we take a closer look at the raw values of the data within our .fcs files, and explore the various ways to [transform](https://docs.flowjo.com/flowjo/graphs-and-gating/gw-transform-overview/) (ie. scale) flow cytometry data in R to better visualize "positive" and "negative populations". In the process, we visualize the differences resulting from applying different transformations commonly used by commercial software. Similarly, we learn how to apply and visualize compensation in context of conventional flow cytometry files. + +
+
+ +### Manual and Automated Gating + +![](images/openCyto.png){width=75%} + +[**Week 8: March 23, 2026**]{.underline} Within this session, we explore various ways to implement gating for flow cytometry files in R. We will explore manual approaches utilizing [flowGate](https://www.bioconductor.org/packages/release/bioc/html/flowGate.html), as well as automated options with [openCyto](https://www.bioconductor.org/packages/release/bioc/vignettes/openCyto/inst/doc/HowToAutoGating.html) and it's gating templates. We additionally will explore how to provide gate constraints and various ways to visually screen and evaluate the outcomes within the context of our own projects. + +
+
+ +### Conference Break 1 + +No class week of March 30, 2026. If you are attending the [ABRF conference](https://web.cvent.com/event/6aeb3907-0f0b-418d-a0d5-91f4de72c144/summary?RefId=ABRF%202026%20Annual%20Meeting%20Home%20Page), track me down at the [Complex Data Analysis in Flow Cytometry: Navigating the Landscape](https://web.cvent.com/event/6aeb3907-0f0b-418d-a0d5-91f4de72c144/websitePage:89d4bbd7-0f7c-4235-a335-97866af9506b) talk on Monday, March 30th at 4:30 PM. + +
+
+ +### It's Raining Functions! + +![](https://images2.minutemediacdn.com/image/upload/c_fill,w_720,ar_16:9,f_auto,q_auto,g_auto/shape/cover/sport/raining-monkeys-e3fa8001e4eb47433b1cc58e2017d2b8.png){width=75%} + +[**Week 9: April 6, 2026**]{.underline} In the course of this ninth session, we tackle one of the harder but most useful concepts to learn for a beginner, namely [functions](https://r4ds.had.co.nz/functions.html). We explore what they are, how their individual arguments work, how they differ from for-loops, and how to create our own to do useful work, reduce the number times code gets copied and pasted. Additionally, some functional programming best practices will be introduced, as well as provide introduction to how to use the walk and map functions from the [purrr](https://purrr.tidyverse.org/) package. + +
+
+ +### Downsampling and Concatenation + +![](https://www.ibm.com/content/dam/connectedassets-adobe-cms/worldwide-content/creative-assets/s-migr/ul/g/7d/10/downsampling-near-miss-v3.png){width=50%} + +[**Week 10: April 13, 2026**]{.underline} Within this session, we will expand on our growing understanding of GatingSets, functions and fcs file internals to write a script to downsample your fcs files to a desired number (or percentage) of cells for a given cell population. We will additionally learn how to concatenate these downsampled files together, and save them to a new .fcs file in ways that the metadata can be read by commercial software without the scaling being widely thrown off. + +
+
+ +### Retrieving data for Statistics + +![](images/TidyData.png){width=33%} + +[**Week 11: April 20, 2026**]{.underline} Leveraging the increased familiarity working with the various packages this far in the course, in this session we will retrieve summary statistics for the gates within our GatingSet, and programmatically derrive out tidy data.frames for use in statistical analyses typically used by many Immunologist. In the process, we add a couple additional plot types to our ggplot2 arsenal to hold in reserve should Prism prices go up again. + +
+
+ +### Spectral Signatures + +![](images/Signatures.png){width=75%} + +[**Week 12: April 27, 2026**]{.underline} As part of this session, we will explore how to extract fluorescent signatures from our raw spectral flow cytometry reference controls. Building on prior concepts, we will learn to isolate median signatures from positive and negative gates, and how to derrive and plot normalized signatures. We also introduce [plotly](https://plotly.com/r/) package and it's interactive plotting features, before showcasing various packages attempts at facilitating signature retrieval. + +
+
+ +### Similarities and Hotspots + +![](images/Hotspot.png){width=75%} + +[**Week 13: May 4, 2026**]{.underline} During this session, we will utilize the spectral signature matrix isolated from raw spectral flow cytometry controls and evaluate different ways of evaluating how similar different fluorescent signatures are to each other. In the process, we will gain better understanding of the metrics behind similarity (cosine), panel complexity (kappa), and unmixing-dependent spreading (collinearity). + +
+
+ +### Unmixing in R + +![](images/Unmixing.png){width=75%} + +[**Week 14: May 11, 2026**]{.underline} In the course of this session, we will attempt a reach goal of many, namely carry out unmixing of raw .fcs files using the spectral signatures we have isolated from our unmixing controls, and write to new .fcs files. After evaluating the necessary internals, we will explore how various current cytometry R packages have implemented their own unmixing functions, and the various limitations that each approach has encountered. + +
+
+ +### Cleaning Algorithms + +![](images/DegradingAPCFire810Signatures.png){width=75%} + +[**Week 15: May 18, 2026**]{.underline} In the span of this session, we will directly compare how various Bioconductor data cleanup algorithms (namely [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf), [FlowAI](https://www.bioconductor.org/packages/release/bioc/vignettes/flowAI/inst/doc/flowAI.html), [FlowCut](https://www.bioconductor.org/packages/release/bioc/vignettes/flowCut/inst/doc/flowCut.html), and [FlowClean](https://www.bioconductor.org/packages/release/bioc/vignettes/flowClean/inst/doc/flowClean.pdf)) tackle distinguishing and removing bad quality events. We will see how they perform with previously identified good quality and horrific quality .fcs files. We will whether the implemented algorithmic decisions made sense, and how to customize them within our workflows to achieve our own desired goals. + +
+
+ +### Clustering Algorithms + +![](https://docs.flowjo.com/wp-content/uploads/2023/03/image-6-1024x1024.png){width=50%} + +[**Week 16: May 25, 2026**]{.underline} As part of this session, we venture away from supervised and semi-supervised analyses to explore unsupervised clustering approaches, namely [FlowSOM](https://onlinelibrary.wiley.com/doi/10.1002/cyto.a.22625) and [Phenograph](https://www.colibri-cytometry.com/post/the-peculiarities-of-phenograph). We will compare outcomes depending markers included, transformations applied, and panel used to gain a greater familiarity with how they work. We wrap up by investigating ways to visualize marker expression of cells ending up in each cluster, and how to backgate them to our manual gates. + +
+
+ +### Normalization: Batch Effect or Real Biology + +![](images/ridgeplots.png){width=75%} + +[**Week 17: June 1, 2026**]{.underline} During this session, we will dive into evaluating the performance of two commonly used normalization algorithms, [CytoNorm](https://github.com/saeyslab/CytoNorm) and [CyCombine](https://github.com/biosurf/cyCombine). We will utilize our ggplot2 and functional programming toolkits to create a customized workflow to visualize the differences for our respective cell populations before and after normalization, to better evaluate how the respective parameter choices can affect the process. + +
+
+ +### Conference Break 2 + +No class week of June 8, 2026. If you are attending the [Cyto conference](https://www.cytoconference.org/?gad_source=1&gad_campaignid=20633392465&gbraid=0AAAAADoJzsvHaLZAq9tqn_aTAQGEzIk_V&gclid=CjwKCAiA-sXMBhAOEiwAGGw6LJFFV69xaAU3s7bElL86RdnRNFwAYqOQO78MrIYQuG1qvRU6HTN3ZRoCGmAQAvD_BwE), track me down at my talks and posters. + +
+
+ + +### Dimensionality Visualization + +![](images/DimViz.png){width=75%} + +[**Week 18: June 15, 2026**]{.underline} For this session, we explore how dimensionality visualization algorithms perform [tSNE](https://github.com/lvdmaaten/bhtsne/) and [UMAP](https://github.com/jlmelville/uwot) in R using our raw and unmixed samples. In the process, we will explore how markers included, number of cells, and presence of bad quality events can impact the [final](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1011288) visualizations. Finally, we will provide an overview of how to link to Python to additionally run [PaCMAP](https://github.com/YingfanWang/PaCMAP) and [PHATE](https://github.com/KrishnaswamyLab/PHATE) visualizations for use in R. + +
+
+ +### Annotating Unsupervised Clusters + +![](https://media.geeksforgeeks.org/wp-content/uploads/20230731175958/Bagging-classifier.png){width=50%} + +[**Week 19: June 22, 2026**]{.underline} In the course of this session, we explore ways to scale our efficiency in figuring out what an unsupervised cluster of cells may be, by employing several annotation packages. We explore how these work under the hood in their decision making process, and how to link them to reference data from external repositories for additional evaluation. + +
+
+ +### The Art of GitHub Diving + +![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTE3IHi5Y2itTmH60RF81y5b8JnSeeJvTTATA&s){width=100%} + +[**Week 20: June 29, 2026**]{.underline} Within this session, we delve into the art of investigating a new-to-you GitHub repository. We discuss the overall structure of R packages stored as source files within GitHub repositories, and how to leverage this knowledge when troubleshooting errors thrown by underdocumented R packages. We discuss how to modify identified functions, evaluate them, and process to submit helpful bug reports back to the original project to help fix the issue. + +
+
+ +### XML Files All The Way Down + +![](https://www.mssqltips.com/wp-content/images-tips/2899_img5.jpg){width=50%} + +[**Week 21: July 6, 2026**]{.underline} Breaking news alert, most of the experiment templates and worksheet layouts we work with as cytometrist are .xml files. In this session, we learn some additional coding tools to allow us to work with these types of files to extract useful data. In this session, we test out our new problem solving abilities to retrieve data from SpectroFlo and Diva .xml files to monitor how our core's flow cytometers behaved for various users last week. + +
+
+ +### Utilizing Bioconductor packages + +![](images/Bioconductor.svg){width=75%} + +[**Week 22: July 13, 2026**]{.underline} Many of the R packages for Flow Cytometry we have utilized in this course were packages from the [Bioconductor](https://www.bioconductor.org/) project. We take a look at what makes Bioconductor packages unique compared to packages found on GitHub and CRAN, explore some of their specific infrastructure types for flow cytometry data, and highlight some useful packages for downstream analysis that we haven't had time to properly explore. + +
+
+ +### Building your First R package + +![](images/R.png){width=33%} + +[**Week 23: July 20, 2026**]{.underline} For most of the course, we have been working with R packages that other individuals built and maintained. In this session, we leverage all your hard work from the rest of the course and corral the unwieldly arsenal of functions you wrote into your [first R package](https://r-pkgs.org/introduction.html) for easier use. We will discuss the individual pieces of an R package, the importance of a well-setup namespace file, and how to generate help page manuals to refer future-you back to what your individual function arguments actually do. + +
+
+ +### Everyone Get's a Quarto Website + +![](images/3L_V1_Gain_2024.png){width=75%} + +[**Week 24: July 27, 2026**]{.underline} In this session, we will extend the knowledge of .R and .qmd files you have gained from the course and extend them to create your own website using [Quarto](). We discuss the additional files that are required, how to customize and render the website locally, and finally set up [Quarto Pub](https://quartopub.com/) or [GitHub Pages](https://docs.github.com/en/pages) website that we are to access online. + +
+
+ + +### Reproducibility and Replicability + +![](https://media.springernature.com/lw1200/springer-static/image/art%3A10.1038%2F533452a/MediaObjects/41586_2016_BF533452a_Fige_HTML.jpg){width=50%} + +[**Week 25: August 3, 2026**]{.underline} Throughout the course, we emphasized the importance of making your workspaces and code reproducible and replicable. But what do we mean by these terms, and are there best practices we could add to our existing workflow to do this more efficiently? We explore a couple community-led efforts within the cytometry space and troubleshoot their implementation into a previously published pipeline. + +
+
+ +### Conference Break 3 + +No class week of August 10, 2026. If you are attending the [BioC conference](https://bioc2026.bioconductor.org/), track me down at my talk/poster. + +
+
+ +### Open Source Licenses + +![](https://cdn.media.amplience.net/i/epammarketplace/Software_Licenses_1?maxW=1200&qlt=80&fmt=jpg&bg=rgb(255,255,255)&v=1365581685114){width=50%} + +[**Week 26: August 17, 2026**]{.underline} For this course, we have relied extensively on open-source software to create our own data analysis pipelines. In the process, you may have some recollection of the various license names. But what impact do all these different names have in the end? We take a brief deep-dive into the ecosystem of [free and open-source licenses](https://en.wikipedia.org/wiki/Free_and_open-source_software), and evaluate what their respective license terms mean for us as individual users of the code, as well as potential developers extending existing codebases. + +
+
+ +### Validating Algorthmic Tools + +![](https://ecx.images-amazon.com/images/I/41f9FvgwgzL.jpg){width=50%} + +[**Week 27: August 24, 2026**]{.underline} We will be the first to admit, new implementations of algorithms as R packages are awesome! We appreciate the effort that went into them and making them available to the community at large. But what is the best way of evaluating whether they behave as promised, or work for our dataset? During this session, we share tips and tricks to gain better understanding of how a new R package works, and things to watch out for when evaluating complicated algortithms. We wrap with walkthrough of how to generate simulated datasets with known distributions for use in testing. + +
+
+ +### Databases and Repositories + +![](images/Database.png){width=50%} + +[**Week 28: August 31, 2026**]{.underline} During this session, we will learn how to identify and retrieve .fcs files from databases. While many of us are accustomed to working with large datasets of our own making, many of us are increasingly encountering larger-than-memory datasets, as well as files stored in large repositories. In this session, we will explore several database focused R [packages](https://arrow.apache.org/docs/r/), before investigating how to identify and retrieve .fcs files and associated metadata of interest from repositories, namely [ImmPort](https://www.immport.org/shared/) (and maybe [FlowRepository](https://flowrepository.org/) if it can be pinged that afternoon). + +
+
+ +### Assembling Web Data + +![](https://media.brightdata.com/2023/01/Web-scraping-with-R.png){width=50%} + +[**Week 29: September 7, 2026**]{.underline} In this session, we briefly delve into the concepts of web-scraping and APIs in general. We highlight useful packages, namely [httr2](https://httr2.r-lib.org/) and [rvest](https://rvest.tidyverse.org/), and best practices implemented to allow respectful retrieval of useful data without crashing someone's server like some AI startup bot. We finish by providing a list of additional useful resources for those interested in learning more. + +
+
+ +### Future Directions + +![](images/Future.jpg){width=75%} + +[**Week 30: September 14, 2026**]{.underline} In this final of the planned sessions, we revisit our solutions to the challenge problems set out during the beginning of the course. We also discuss potential future topics to visit in the future, and any additional resources that proved helpful throughout the course. + +
+
+ +
+[![AGPL-3.0][agpl3-image]][agpl3] +[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa] +
+ +[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/ +[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png +[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg +[agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html +[agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png +======= --- format: html toc: TRUE @@ -335,4 +674,5 @@ No class week of August 10, 2026. If you are attending the [BioC conference](htt [cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg [agpl3]: https://www.gnu.org/licenses/agpl-3.0.en.html [agpl3-image]: https://www.gnu.org/graphics/agplv3-with-text-162x68.png +>>>>>>> 23a81a59a64966e782d820f6b60f087d577c3b25 [agpl3-shield]: https://img.shields.io/badge/license-AGPLv3-blue \ No newline at end of file diff --git a/_quarto.yml b/_quarto.yml index 0d4b92d..441afbd 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -1,3 +1,4 @@ +<<<<<<< HEAD project: type: website output-dir: docs @@ -63,7 +64,6 @@ website: - text: "00 - Floreada" href: course/00_Floreada/index.qmd - section: "Intro to R" - href: course/01_InstallingRPackages/index.qmd contents: - text: "01 - Installing R Packages" href: course/01_InstallingRPackages/index.qmd @@ -90,3 +90,91 @@ format: html: css: styles.css +======= +project: + type: website + output-dir: docs + render: + - index.qmd + - Schedule.qmd + - ExistingResources.qmd + - PackageWalkthroughs.qmd + - course/index.qmd + - 00_* + - 01_* + - 02_* + - 03_* +website: + google-analytics: "G-LZ35J3XE4D" + announcement: + icon: info-circle + dismissable: true + content: "See Course tab for Course Materials, see YouTube tab for livestream recordings" + type: info + position: below-navbar + page-navigation: true + title: "Cytometry in R" + navbar: + logo: images/hex.svg + background: white + left: + - text: "About" + href: index.qmd + - text: "Schedule" + href: Schedule.qmd + - text: "Course" + href: course/index.qmd + right: + - text: Discussions + href: https://github.com/UMGCCCFCSR/CytometryInR/discussions + - icon: youtube + href: https://www.youtube.com/@CytometryInR + aria-label: YouTube + - icon: github + href: https://github.com/UMGCCCFCSR/CytometryInR + aria-label: GitHub + sidebar: + style: floating + collapse-level: 1 + contents: + - section: "Getting Started" + contents: + - text: "00 - GitHub" + href: course/00_GitHub/index.qmd + - text: "00 - Workstation Setup" + href: course/00_WorkstationSetup/index.qmd + - text: "00 - Positron" + href: course/00_Positron/index.qmd + - text: "00 - Git" + href: course/00_Git/index.qmd + - text: "00 - Quarto" + href: course/00_Quarto/index.qmd + - text: "00 - Getting Help" + href: course/00_Homeworks/index.qmd + - text: "00 - Floreada" + href: course/00_Floreada/index.qmd + - section: "Intro to R" + href: course/01_InstallingRPackages/index.qmd + contents: + - text: "01 - Installing R Packages" + href: course/01_InstallingRPackages/index.qmd + - text: "02 - File Paths" + href: course/02_FilePaths/index.qmd + - text: "03 - Inside a .FCS file" + href: course/03_InsideFCSFile/index.qmd + - section: "Cytometry Core" + href: Schedule.qmd + - section: "Beyond the Sandbox" + href: Schedule.qmd + - section: "The World is your Oyster" + href: Schedule.qmd + page-footer: + left: Made with [Quarto](https://quarto.org/) + right: | + ![AGPL-3.0](/images/AGPL3.png) + ![CC-BY-SA](/images/CCBYSA.png) +format: + html: + css: styles.css + +>>>>>>> 052910a (Macbook sync) diff --git a/course/00_BonusContent/Immport/images/index.qmd b/course/00_BonusContent/Immport/images/index.qmd index 51d4412..4774754 100644 --- a/course/00_BonusContent/Immport/images/index.qmd +++ b/course/00_BonusContent/Immport/images/index.qmd @@ -1,14 +1,14 @@ ---- -title: "ImmPort - Downloading Datasets" -author: "David Rach" -date: 02-06-2026 -format: html -toc: true -toc-depth: 4 ---- - -To download data from the ImmPort Shared Data Repository, first navigate to the [website](https://www.immport.org/shared/home) - -![](images/) - +--- +title: "ImmPort - Downloading Datasets" +author: "David Rach" +date: 02-06-2026 +format: html +toc: true +toc-depth: 4 +--- + +To download data from the ImmPort Shared Data Repository, first navigate to the [website](https://www.immport.org/shared/home) + +![](images/) + For help setting up Aspera Connect, see the following [help documentation](https://www.immport.org/installAsperaHelp) \ No newline at end of file diff --git a/course/00_BonusContent/index.qmd b/course/00_BonusContent/index.qmd index b1442e5..d4c0202 100644 --- a/course/00_BonusContent/index.qmd +++ b/course/00_BonusContent/index.qmd @@ -1,88 +1,88 @@ ---- -title: "Bonus Content" -author: "David Rach" -date: 02-04-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -This is a miscellaneous page to host walk-throughs of topics that come up via the [Discussion Page](https://github.com/UMGCCCFCSR/CytometryInR/discussions). Rather than re-explain how to in the comments, I want to have a place to post short-walkthroughs to solve these issues, while avoiding incorporating it into the existing walk-throughs at this point in time. I hope you find it useful, and pardon the organized chaos of miscellaneous topics. - -# 00_WorkStationSetup - -## Windows Arm - -### Positron - -On the main Positron [installation page](https://positron.posit.co/download.html), only the installers for Windows Computers with x86 chips are currently shown. There is a beta (experimental) version of Positron for Windows ARM (ex. Snapdragons), but it needs to be installed from Positron's GitHub [releases page](https://github.com/posit-dev/positron/releases). - -![](/course/00_BonusContent/images/WindowsArm.png) - -Please note, you should download the most recent version that is available to you, as they continue to update it and fix bugs. As of February 04, 2026, you would also need to install Quarto separately. - -To install Quarto, first navigate to their [website](https://quarto.org/docs/get-started/). Quarto for Windows ARM was implemented in [2023](https://github.com/quarto-dev/quarto-cli/issues/190), so the regular installer should work. - -![](/course/00_BonusContent/images/WindowsArm.png) - -Also, you would need a Python arm64 installation installed if you decide you want to venture into using Python at any point. - -# 00_Positron - -## Visual Mode - -Within Positron, there exist a toggle button to switch between source and visual mode on Quarto documents. But what do you do when you can't find it? - -![](/course/00_BonusContent/images/ToggleAfika.png) - -Tuns out.... Visual Mode is currently broken, so the developers [removed it](https://github.com/posit-dev/positron/issues/1805#issuecomment-3792323435) about two weeks ago. - -The current way to switch to it is via right-click, then select edit visual mode. - -![](/course/00_BonusContent/images/EditVisualMode.png) - -Vice versa, once there, you can revert by right-clicking and selecting Edit Source Mode - -![](/course/00_BonusContent/images/EditSourceMode.png) - -The process of figuring what is going on highlights how to use a GitHub Discussion Page. This is [Positrons](https://github.com/posit-dev/positron/discussions?discussions_q=visual+button) when I searched for visual button. I then found that a similar question was asked 3 days ago that led me to the linked thread above. - -![](/course/00_BonusContent/images/DiscussionPageSearch.png) - -# 00_Git - -## Not Detecting Git - -If you leave the "Initialize Git Repository" option unclicked when setting up a New Folder from Template, Git will not be active within your project folder. - -![](/course/00_BonusContent/images/NoGitInitialized.png) - -As a result, when you try to use the `usethis` packages `use_github(private=true)` function, you will get an error that resembles the one below - -![](/course/00_BonusContent/images/NoGitDetected.png) - -To initiate a Git repository after the fact, you will need to go to the Version Control tab in the action bar, and select the option. - -![](/course/00_BonusContent/images/InitializeRepository.png) - -Then, you will need to stage the files you want to work with, and commit them. - -![](/course/00_BonusContent/images/SaveCommit.png) - -`use_github(private=TRUE)` should now be functional at that point. However, you can also choose to continue via Positron's interface instead by selecting Publish. - -![](/course/00_BonusContent/images/PublishBranch.png) - -It will then ask you whether you want to save it as either a Public or a Private repository. - -![](/course/00_BonusContent/images/PrivateRepository.png) - -And if all goes well, you will see the "Successs" pop-up in the lower-right - +--- +title: "Bonus Content" +author: "David Rach" +date: 02-04-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +This is a miscellaneous page to host walk-throughs of topics that come up via the [Discussion Page](https://github.com/UMGCCCFCSR/CytometryInR/discussions). Rather than re-explain how to in the comments, I want to have a place to post short-walkthroughs to solve these issues, while avoiding incorporating it into the existing walk-throughs at this point in time. I hope you find it useful, and pardon the organized chaos of miscellaneous topics. + +# 00_WorkStationSetup + +## Windows Arm + +### Positron + +On the main Positron [installation page](https://positron.posit.co/download.html), only the installers for Windows Computers with x86 chips are currently shown. There is a beta (experimental) version of Positron for Windows ARM (ex. Snapdragons), but it needs to be installed from Positron's GitHub [releases page](https://github.com/posit-dev/positron/releases). + +![](/course/00_BonusContent/images/WindowsArm.png) + +Please note, you should download the most recent version that is available to you, as they continue to update it and fix bugs. As of February 04, 2026, you would also need to install Quarto separately. + +To install Quarto, first navigate to their [website](https://quarto.org/docs/get-started/). Quarto for Windows ARM was implemented in [2023](https://github.com/quarto-dev/quarto-cli/issues/190), so the regular installer should work. + +![](/course/00_BonusContent/images/WindowsArm.png) + +Also, you would need a Python arm64 installation installed if you decide you want to venture into using Python at any point. + +# 00_Positron + +## Visual Mode + +Within Positron, there exist a toggle button to switch between source and visual mode on Quarto documents. But what do you do when you can't find it? + +![](/course/00_BonusContent/images/ToggleAfika.png) + +Tuns out.... Visual Mode is currently broken, so the developers [removed it](https://github.com/posit-dev/positron/issues/1805#issuecomment-3792323435) about two weeks ago. + +The current way to switch to it is via right-click, then select edit visual mode. + +![](/course/00_BonusContent/images/EditVisualMode.png) + +Vice versa, once there, you can revert by right-clicking and selecting Edit Source Mode + +![](/course/00_BonusContent/images/EditSourceMode.png) + +The process of figuring what is going on highlights how to use a GitHub Discussion Page. This is [Positrons](https://github.com/posit-dev/positron/discussions?discussions_q=visual+button) when I searched for visual button. I then found that a similar question was asked 3 days ago that led me to the linked thread above. + +![](/course/00_BonusContent/images/DiscussionPageSearch.png) + +# 00_Git + +## Not Detecting Git + +If you leave the "Initialize Git Repository" option unclicked when setting up a New Folder from Template, Git will not be active within your project folder. + +![](/course/00_BonusContent/images/NoGitInitialized.png) + +As a result, when you try to use the `usethis` packages `use_github(private=true)` function, you will get an error that resembles the one below + +![](/course/00_BonusContent/images/NoGitDetected.png) + +To initiate a Git repository after the fact, you will need to go to the Version Control tab in the action bar, and select the option. + +![](/course/00_BonusContent/images/InitializeRepository.png) + +Then, you will need to stage the files you want to work with, and commit them. + +![](/course/00_BonusContent/images/SaveCommit.png) + +`use_github(private=TRUE)` should now be functional at that point. However, you can also choose to continue via Positron's interface instead by selecting Publish. + +![](/course/00_BonusContent/images/PublishBranch.png) + +It will then ask you whether you want to save it as either a Public or a Private repository. + +![](/course/00_BonusContent/images/PrivateRepository.png) + +And if all goes well, you will see the "Successs" pop-up in the lower-right + ![](/course/00_BonusContent/images/SuccessToGitHub.png) \ No newline at end of file diff --git a/course/00_Floreada/.DS_Store b/course/00_Floreada/.DS_Store deleted file mode 100644 index 5152ac0..0000000 Binary files a/course/00_Floreada/.DS_Store and /dev/null differ diff --git a/course/00_Floreada/data/workspace.wsp b/course/00_Floreada/data/workspace.wsp index 429fcba..ef3cd19 100644 --- a/course/00_Floreada/data/workspace.wsp +++ b/course/00_Floreada/data/workspace.wsp @@ -1,166214 +1,166214 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/course/00_Floreada/data/workspace.xml b/course/00_Floreada/data/workspace.xml index a5181e5..fd59a7f 100644 --- a/course/00_Floreada/data/workspace.xml +++ b/course/00_Floreada/data/workspace.xml @@ -1,6569 +1,6569 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/course/00_Floreada/index.qmd b/course/00_Floreada/index.qmd index 418d8a1..f13f653 100644 --- a/course/00_Floreada/index.qmd +++ b/course/00_Floreada/index.qmd @@ -1,375 +1,375 @@ ---- -title: "Using Floreada" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 5 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/3jDed1gmq0M?si=ge-UPqQ6lbXAtn_Z) - - - -For screen-shot slides, click [here](/course/00_Floreada/slides.qmd) - -# Background - -As a "Cytometry in R" course, we will primarily be working in R. However, within our daily workflows and projects here at our flow cytometry core, we often use various flow cytometry softwares (like [FlowJo](https://flowjo.com/flowjo10/download) or [FCS Express](https://denovosoftware.com/)) for various tasks. Fortunately, R packages like [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) can allow us to import our manually drawn gates from existing FlowJo workspaces so that we can work with them in R. - -For this course, we are adamant about staying neutral in regards to both commercial software or instrument vendors as much as possible. If they have worked with the open-source community to make their files readable and accessible via R, we will showcase how to integrate those tools into your own workflows. At the same time, this being a [**free**]{.underline} course, it doesn't make sense to turn around and ask you to go and either free trial or buy an expensive software license just to see how a particular free R package works. - -Fortunately, for showing how to use this [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) functionality, we can use [Floreada.io](https://floreada.io/). It is a simple (but free) web-based analysis platform that can be used to draw manual gates for your .fcs files of interest. These can then be saved as Floreada workspaces for later use. We typically recommend it to users from labs that do flow experiments infrequently. Fortunately thanks to the hard work of its [developers](https://floreada.io/about), it can also save the gated files as [FlowJo](https://flowjo.com/flowjo10/download) v10 .wsp files, which with a small workaround become usable within the [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) pipeline. - -To facilitate this, we will provide a small walk-through of how to use it for those who want to create a .wsp with their own .fcs files for [Week 5](https://umgcccfcsr.github.io/CytometryInR/Schedule#gating-sets). - -# Walk-through - -## Floreada - -### Loading Dataset - -First, open your web browser and navigate to the [website](https://floreada.io/) - - -Click on Start to proceed to the next page. - -![](images/01_LandingPage.png) - -
- ---- - -![](images/02_InitialPage.png) - - -
- ---- - -Once that is done, select the File tab on the upper navigation bar. Then click on Open File(s). - -![](images/03_OpenFiles.png){fig-align="left"} - -
- ---- - -From there, select your .fcs files of interest, and click Open. - -![](images/04_SelectFCSFiles.png) - -
- ---- - -The .fcs files will now load in, and you should see a view similar to the one below. On the left side-bar, you have your gating options (Rectangle, Polygon, Range, Elipse, Quad, etc). Next to these on the right you have the FCS files that are loaded into the workspace. Then on the right, you have the visual display for your selected specimen. - -![](images/05_InitialFiles.png) - -
- ---- - -### Switching Axis Markers - - -If you left click on the axis name (SSC-H or FSC-H in this case), you will be able to select other markers by which to gate your specimen. For the provided example, we were using a raw spectral flow cytometry .fcs file, so the names of the detectors are present. - -![](images/06_LeftClick.png) - -
- ---- - -For now, I plan to start off by gating for singlets. I switch the y-axis to FSC-H, and then proceed to switch the x-axis to FSC-A. - -![](images/07_LeftClickXaxis.png) - -
- ---- - -### Creating Gates - -With this done, I can now select the Poly gate tab on the upper left. - -![](images/08_PolygonGateSelect.png) - -
- ---- - -Then manually click on the locations on the plot to add the individual gate nodes. - -![](images/08_PolygonGateStart.png) - -
- ---- - -To complete the gate, I click back to the original node point. At this point, the popup will allow you to name the gate. - -![](images/08_PolygonGateCreate.png) - -
- ---- - -To adjust the polygon gate, you can click on a node and drag it to expand or contract in a particular direction - -![](images/08_PolygonGateNode.png) - -
- ---- - -To move the entire gate, first click on a node to select the gate, then click in the center of the gate to adjust its location. - -![](images/08_PolygonGateCenter.png) - -
- ---- - - -### Additional Gates - -Unfortunately for those with the force-of-habit from using other softwares, double-clicking within the gate doesn't do anything. To continue gating on the selected cells, you will need to click on the newly created gate name on the left. This will result in visualizing the isolated cells. - -![](images/09_SecondLanding.png) - -
- ---- - -Once this is done, you can repeat the previous steps to change the axis markers and create a second gate. For this example, we went with a "Cells" gate to exclude debris from this particular sample. - -![](images/09_SecondGate.png) - -
- ---- - -Having created the "Cells" gate, we will be switching gating based on FSC and SSC to using the detector parameters. - -The samples in this example were acquired to derive the cell counts and concentration of various cell populations within cryopreserved cord and peripheral blood mononuclear cells (CBMC and PBMC) specimens after thawing. - -They were stained with CD19 BV421, CD45 PE, and CD14 APC on a [5-Laser Cytek Aurora](https://spectrum.cytekbio.com/), before unmixing, this would correspond respectively to V1, YG1/B4, R1/YG4 peaks respectively. - -
- ---- - -### Scaling/Transformation - -When we switch the axis, we can see that the scaling/transformation is not ideal, as the staining and not-staining populations are scrunched up together in the center of the plot. - -![](images/10_Untransformed.png) - -
- ---- - -To change the scaling/transformation, we need to click directly on the axis. - -![](images/10_ClickGrid.png) - -
- ---- - -From there, when we click on the drop-down, we see the various transformation options. We will select [Logicle](https://pubmed.ncbi.nlm.nih.gov/16604519/), given we are working with spectral flow cytometry files. - -![](images/10_SelectLogicle.png) - -
- ---- - -This y-axis values are subsequently visualized with the logicle transformation applied, increasing our resolution between the positive and negative population. - -![](images/10_LogicleY.png) - -
- ---- - -We can then repeat this for the x-axis, adjusting the fine-tune options for the scaling as needed. - -![](images/10_DoubleLogicleAxis.png) - -
- ---- - -### Navigating Gating Hierarchy - -With this done, let's first draw a rectangle gate for the CD45+ (B4-A) cells. - -![](images/10_CD45Gate.png) - -
- ---- - -And then selecting that population by clicking on the gate name, let's proceed and gate the CD19+ cells (V2-A). - -![](images/10_CD19Gate.png) - -
- ---- - -As you can see, we now have the various gates present in the gating hierarchy for the respective .fcs file. To return to a previous gated population, we would click on the parent population above it. - -![](images/11_ReturnToPrevious.png) - -
- ---- - -We can subsequently add an additional gate at this gating level for the likely debris population (the threshold setting was suboptimal for this experimental run). - -![](images/11_AdditionalGates.png) - -
- ---- - -### Copying Gates - -This was the process for gating for a single specimen. To copy gates over to the other specimens, we have two options. First, holding down your Ctrl (or equivalent) button, you can click on the individual gate names. - -![](images/11_ControlHighlight.png) - -
- ---- - -From there, you can drag them down to the next specimen and apply them. - -![](images/11_ApplyToNext.png) - -
- ---- - -Alternatively, you can drag down the highlighted gated to the Pipelines Tab, and apply to All Files. This will result in the gates being copied to all specimens in the experiment. - -![](images/11_ApplyAllViaPipelines.png) - -
- ---- - -![](images/13_PipelineAdjustAll.png) - - -
- ---- - -Adjustments within Pipelines will carry over to all other respective unmodified specimens that share it’s gates. - -![](images/13_PipelineAdjustCD19.png) - -
- ---- - -Once this is done, I recommend cycling through the gates for each specimen, just to ensure that the gates were positioned correctly before saving the workspace. - -![](images/12_ClickAdjust.png) - -
- ---- - -### Saving Workspace - -With everyone now "correctly" gated, we can proceed to save the workspace so that we can reopen it later from another browser. - -To do this we open the File tab from the upper navigation bar, and select Save Workspace. - -![](images/14_SaveWorkspace.png) - -
- ---- - -From there we have a couple options, for now let's select Floreada Workspace. Where it is saved at will depend on your individual browser settings, so watch for a popup. - -![](images/14_FloreadaWorkspace.png) - -
- ---- - -Alternatively (and crucially for the CytoML pipeline) we can also choose to save it as a FlowJo v10 .wsp file. - -![](images/14_FlowJoWorkspace.png) - -
- ---- - -In both cases, you will end up with Workspace files that can be used later to access your created gates - -![](images/WorkspaceFiles.png) - -
- ---- - -### Reopening Workspace - -To reopen the Floreada workspace within the browser, reopen the website, and select the Open File(s) option. - -![](images/15_Reopening.png) - -
- ---- - -From there, select both the Floreada Workspace file as well as the .fcs files - - -![](images/15_ReopeningSelectAll.png) - -
- ---- - -At which point you will now be back to the point you last saved at. - -![](images/15_ReopenedWorkspace.png) - -
- ---- - -## CytoML - -Due to a unknown formatting bug, the Floreada produced FlowJo v10 .wsp is not directly accessible by CytoML at the time of this course. However, the issue is resolved as soon as the file is opened the first time within FlowJo v10, regardless of whether you have a log in or not. Strange? Yes, but we will take the workaround. - -So, for anyone on Windows or MacOS, download [FlowJo v10](https://www.flowjo.com/flowjo10/overview). Once installed, open the software, and close the login popups. Once there, open the Floreada created FlowJo.wsp file. Since you haven't logged in, it won't show any events. But it will correct the formatting bug. Close the software, and return to R. Your Floreada sourced .WSP file should now be readable by CytoML. - -Odd? For sure. Fixable? Likely, I will set a reminder to work with the Floreada and CytoML devs to see if we can cut out the need for this workaround. - -# Wrap-up - - -# Additional Resources - -[Floreada Documentation](https://floreada.io/docs/) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using Floreada" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/3jDed1gmq0M?si=ge-UPqQ6lbXAtn_Z) + + + +For screen-shot slides, click [here](/course/00_Floreada/slides.qmd) + +# Background + +As a "Cytometry in R" course, we will primarily be working in R. However, within our daily workflows and projects here at our flow cytometry core, we often use various flow cytometry softwares (like [FlowJo](https://flowjo.com/flowjo10/download) or [FCS Express](https://denovosoftware.com/)) for various tasks. Fortunately, R packages like [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) can allow us to import our manually drawn gates from existing FlowJo workspaces so that we can work with them in R. + +For this course, we are adamant about staying neutral in regards to both commercial software or instrument vendors as much as possible. If they have worked with the open-source community to make their files readable and accessible via R, we will showcase how to integrate those tools into your own workflows. At the same time, this being a [**free**]{.underline} course, it doesn't make sense to turn around and ask you to go and either free trial or buy an expensive software license just to see how a particular free R package works. + +Fortunately, for showing how to use this [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) functionality, we can use [Floreada.io](https://floreada.io/). It is a simple (but free) web-based analysis platform that can be used to draw manual gates for your .fcs files of interest. These can then be saved as Floreada workspaces for later use. We typically recommend it to users from labs that do flow experiments infrequently. Fortunately thanks to the hard work of its [developers](https://floreada.io/about), it can also save the gated files as [FlowJo](https://flowjo.com/flowjo10/download) v10 .wsp files, which with a small workaround become usable within the [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) pipeline. + +To facilitate this, we will provide a small walk-through of how to use it for those who want to create a .wsp with their own .fcs files for [Week 5](https://umgcccfcsr.github.io/CytometryInR/Schedule#gating-sets). + +# Walk-through + +## Floreada + +### Loading Dataset + +First, open your web browser and navigate to the [website](https://floreada.io/) + + +Click on Start to proceed to the next page. + +![](images/01_LandingPage.png) + +
+ +--- + +![](images/02_InitialPage.png) + + +
+ +--- + +Once that is done, select the File tab on the upper navigation bar. Then click on Open File(s). + +![](images/03_OpenFiles.png){fig-align="left"} + +
+ +--- + +From there, select your .fcs files of interest, and click Open. + +![](images/04_SelectFCSFiles.png) + +
+ +--- + +The .fcs files will now load in, and you should see a view similar to the one below. On the left side-bar, you have your gating options (Rectangle, Polygon, Range, Elipse, Quad, etc). Next to these on the right you have the FCS files that are loaded into the workspace. Then on the right, you have the visual display for your selected specimen. + +![](images/05_InitialFiles.png) + +
+ +--- + +### Switching Axis Markers + + +If you left click on the axis name (SSC-H or FSC-H in this case), you will be able to select other markers by which to gate your specimen. For the provided example, we were using a raw spectral flow cytometry .fcs file, so the names of the detectors are present. + +![](images/06_LeftClick.png) + +
+ +--- + +For now, I plan to start off by gating for singlets. I switch the y-axis to FSC-H, and then proceed to switch the x-axis to FSC-A. + +![](images/07_LeftClickXaxis.png) + +
+ +--- + +### Creating Gates + +With this done, I can now select the Poly gate tab on the upper left. + +![](images/08_PolygonGateSelect.png) + +
+ +--- + +Then manually click on the locations on the plot to add the individual gate nodes. + +![](images/08_PolygonGateStart.png) + +
+ +--- + +To complete the gate, I click back to the original node point. At this point, the popup will allow you to name the gate. + +![](images/08_PolygonGateCreate.png) + +
+ +--- + +To adjust the polygon gate, you can click on a node and drag it to expand or contract in a particular direction + +![](images/08_PolygonGateNode.png) + +
+ +--- + +To move the entire gate, first click on a node to select the gate, then click in the center of the gate to adjust its location. + +![](images/08_PolygonGateCenter.png) + +
+ +--- + + +### Additional Gates + +Unfortunately for those with the force-of-habit from using other softwares, double-clicking within the gate doesn't do anything. To continue gating on the selected cells, you will need to click on the newly created gate name on the left. This will result in visualizing the isolated cells. + +![](images/09_SecondLanding.png) + +
+ +--- + +Once this is done, you can repeat the previous steps to change the axis markers and create a second gate. For this example, we went with a "Cells" gate to exclude debris from this particular sample. + +![](images/09_SecondGate.png) + +
+ +--- + +Having created the "Cells" gate, we will be switching gating based on FSC and SSC to using the detector parameters. + +The samples in this example were acquired to derive the cell counts and concentration of various cell populations within cryopreserved cord and peripheral blood mononuclear cells (CBMC and PBMC) specimens after thawing. + +They were stained with CD19 BV421, CD45 PE, and CD14 APC on a [5-Laser Cytek Aurora](https://spectrum.cytekbio.com/), before unmixing, this would correspond respectively to V1, YG1/B4, R1/YG4 peaks respectively. + +
+ +--- + +### Scaling/Transformation + +When we switch the axis, we can see that the scaling/transformation is not ideal, as the staining and not-staining populations are scrunched up together in the center of the plot. + +![](images/10_Untransformed.png) + +
+ +--- + +To change the scaling/transformation, we need to click directly on the axis. + +![](images/10_ClickGrid.png) + +
+ +--- + +From there, when we click on the drop-down, we see the various transformation options. We will select [Logicle](https://pubmed.ncbi.nlm.nih.gov/16604519/), given we are working with spectral flow cytometry files. + +![](images/10_SelectLogicle.png) + +
+ +--- + +This y-axis values are subsequently visualized with the logicle transformation applied, increasing our resolution between the positive and negative population. + +![](images/10_LogicleY.png) + +
+ +--- + +We can then repeat this for the x-axis, adjusting the fine-tune options for the scaling as needed. + +![](images/10_DoubleLogicleAxis.png) + +
+ +--- + +### Navigating Gating Hierarchy + +With this done, let's first draw a rectangle gate for the CD45+ (B4-A) cells. + +![](images/10_CD45Gate.png) + +
+ +--- + +And then selecting that population by clicking on the gate name, let's proceed and gate the CD19+ cells (V2-A). + +![](images/10_CD19Gate.png) + +
+ +--- + +As you can see, we now have the various gates present in the gating hierarchy for the respective .fcs file. To return to a previous gated population, we would click on the parent population above it. + +![](images/11_ReturnToPrevious.png) + +
+ +--- + +We can subsequently add an additional gate at this gating level for the likely debris population (the threshold setting was suboptimal for this experimental run). + +![](images/11_AdditionalGates.png) + +
+ +--- + +### Copying Gates + +This was the process for gating for a single specimen. To copy gates over to the other specimens, we have two options. First, holding down your Ctrl (or equivalent) button, you can click on the individual gate names. + +![](images/11_ControlHighlight.png) + +
+ +--- + +From there, you can drag them down to the next specimen and apply them. + +![](images/11_ApplyToNext.png) + +
+ +--- + +Alternatively, you can drag down the highlighted gated to the Pipelines Tab, and apply to All Files. This will result in the gates being copied to all specimens in the experiment. + +![](images/11_ApplyAllViaPipelines.png) + +
+ +--- + +![](images/13_PipelineAdjustAll.png) + + +
+ +--- + +Adjustments within Pipelines will carry over to all other respective unmodified specimens that share it’s gates. + +![](images/13_PipelineAdjustCD19.png) + +
+ +--- + +Once this is done, I recommend cycling through the gates for each specimen, just to ensure that the gates were positioned correctly before saving the workspace. + +![](images/12_ClickAdjust.png) + +
+ +--- + +### Saving Workspace + +With everyone now "correctly" gated, we can proceed to save the workspace so that we can reopen it later from another browser. + +To do this we open the File tab from the upper navigation bar, and select Save Workspace. + +![](images/14_SaveWorkspace.png) + +
+ +--- + +From there we have a couple options, for now let's select Floreada Workspace. Where it is saved at will depend on your individual browser settings, so watch for a popup. + +![](images/14_FloreadaWorkspace.png) + +
+ +--- + +Alternatively (and crucially for the CytoML pipeline) we can also choose to save it as a FlowJo v10 .wsp file. + +![](images/14_FlowJoWorkspace.png) + +
+ +--- + +In both cases, you will end up with Workspace files that can be used later to access your created gates + +![](images/WorkspaceFiles.png) + +
+ +--- + +### Reopening Workspace + +To reopen the Floreada workspace within the browser, reopen the website, and select the Open File(s) option. + +![](images/15_Reopening.png) + +
+ +--- + +From there, select both the Floreada Workspace file as well as the .fcs files + + +![](images/15_ReopeningSelectAll.png) + +
+ +--- + +At which point you will now be back to the point you last saved at. + +![](images/15_ReopenedWorkspace.png) + +
+ +--- + +## CytoML + +Due to a unknown formatting bug, the Floreada produced FlowJo v10 .wsp is not directly accessible by CytoML at the time of this course. However, the issue is resolved as soon as the file is opened the first time within FlowJo v10, regardless of whether you have a log in or not. Strange? Yes, but we will take the workaround. + +So, for anyone on Windows or MacOS, download [FlowJo v10](https://www.flowjo.com/flowjo10/overview). Once installed, open the software, and close the login popups. Once there, open the Floreada created FlowJo.wsp file. Since you haven't logged in, it won't show any events. But it will correct the formatting bug. Close the software, and return to R. Your Floreada sourced .WSP file should now be readable by CytoML. + +Odd? For sure. Fixable? Likely, I will set a reminder to work with the Floreada and CytoML devs to see if we can cut out the need for this workaround. + +# Wrap-up + + +# Additional Resources + +[Floreada Documentation](https://floreada.io/docs/) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Floreada/slides.qmd b/course/00_Floreada/slides.qmd index 1c08ec9..357668a 100644 --- a/course/00_Floreada/slides.qmd +++ b/course/00_Floreada/slides.qmd @@ -1,535 +1,535 @@ ---- -title: "Using Floreada" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -As a "Cytometry in R" course, we will primarily be working in R. However, within our daily workflows and projects here at our flow cytometry core, we often use various flow cytometry softwares (like [FlowJo](https://flowjo.com/flowjo10/download) or [FCS Express](https://denovosoftware.com/)) for various tasks. Fortunately, R packages like [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) can allow us to import our manually drawn gates from existing FlowJo workspaces so that we can work with them in R. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For this course, we are adamant about staying neutral in regards to both commercial software or instrument vendors as much as possible. If they have worked with the open-source community to make their files readable and accessible via R, we will showcase how to integrate those tools into your own workflows. At the same time, this being a [**free**]{.underline} course, it doesn't make sense to turn around and ask you to go and either free trial or buy an expensive software license just to see how a particular free R package works. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Fortunately, for showing how to use this [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) functionality, we can use [Floreada.io](https://floreada.io/). It is a simple (but free) web-based analysis platform that can be used to draw manual gates for your .fcs files of interest. These can then be saved as Floreada workspaces for later use. We typically recommend it to users from labs that do flow experiments infrequently. Fortunately thanks to the hard work of its [developers](https://floreada.io/about), it can also save the gated files as [FlowJo](https://flowjo.com/flowjo10/download) v10 .wsp files, which with a small workaround become usable within the [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) pipeline. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To facilitate this, we will provide a small walk-through of how to use it for those who want to create a .wsp with their own .fcs files for [Week 5](https://umgcccfcsr.github.io/CytometryInR/Schedule#gating-sets). -::: -::: - ---- - -# Walk-through - -## Floreada - -### Loading Dataset - -::: {.fragment} -::: {.callout-tip title="."} -First, open your web browser and navigate to the [website](https://floreada.io/) - -Click on Start to proceed to the next page. -::: -::: - ---- - -![](images/01_LandingPage.png) - ---- - -![](images/02_InitialPage.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once that is done, select the File tab on the upper navigation bar. Then click on Open File(s). -::: -::: - ---- - -![](images/03_OpenFiles.png){fig-align="left"} - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From there, select your .fcs files of interest, and click Open. -::: -::: - ---- - -![](images/04_SelectFCSFiles.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The .fcs files will now load in, and you should see a view similar to the one below. On the left side-bar, you have your gating options (Rectangle, Polygon, Range, Elipse, Quad, etc). Next to these on the right you have the FCS files that are loaded into the workspace. Then on the right, you have the visual display for your selected specimen. -::: -::: - ---- - -![](images/05_InitialFiles.png) - ---- - -### Switching Axis Markers - -::: {.fragment} -::: {.callout-tip title="."} -If you left click on the axis name (SSC-H or FSC-H in this case), you will be able to select other markers by which to gate your specimen. For the provided example, we were using a raw spectral flow cytometry .fcs file, so the names of the detectors are present. -::: -::: - ---- - -![](images/06_LeftClick.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For now, I plan to start off by gating for singlets. I switch the y-axis to FSC-H, and then proceed to switch the x-axis to FSC-A. -::: -::: - ---- - -![](images/07_LeftClickXaxis.png) - ---- - -### Creating Gates - -::: {.fragment} -::: {.callout-tip title="."} -With this done, I can now select the Poly gate tab on the upper left. -::: -::: - ---- - -![](images/08_PolygonGateSelect.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Then manually click on the locations on the plot to add the individual gate nodes. -::: -::: - ---- - -![](images/08_PolygonGateStart.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To complete the gate, I click back to the original node point. At this point, the popup will allow you to name the gate. -::: -::: - ---- - -![](images/08_PolygonGateCreate.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To adjust the polygon gate, you can click on a node and drag it to expand or contract in a particular direction -::: -::: - ---- - -![](images/08_PolygonGateNode.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To move the entire gate, first click on a node to select the gate, then click in the center of the gate to adjust its location. -::: -::: - ---- - -![](images/08_PolygonGateCenter.png) - ---- - - -### Additional Gates - -::: {.fragment} -::: {.callout-tip title="."} -Unfortunately for those with the force-of-habit from using other softwares, double-clicking within the gate doesn't do anything. To continue gating on the selected cells, you will need to click on the newly created gate name on the left. This will result in visualizing the isolated cells. -::: -::: - ---- - -![](images/09_SecondLanding.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, you can repeat the previous steps to change the axis markers and create a second gate. For this example, we went with a "Cells" gate to exclude debris from this particular sample. -::: -::: - ---- - -![](images/09_SecondGate.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having created the "Cells" gate, we will be switching gating based on FSC and SSC to using the detector parameters. - -The samples in this example were acquired to derive the cell counts and concentration of various cell populations within cryopreserved cord and peripheral blood mononuclear cells (CBMC and PBMC) specimens after thawing. - -They were stained with CD19 BV421, CD45 PE, and CD14 APC on a [5-Laser Cytek Aurora](https://spectrum.cytekbio.com/), before unmixing, this would correspond respectively to V1, YG1/B4, R1/YG4 peaks respectively. -::: -::: - ---- - -### Scaling/Transformation - -::: {.fragment} -::: {.callout-tip title="."} -When we switch the axis, we can see that the scaling/transformation is not ideal, as the staining and not-staining populations are scrunched up together in the center of the plot. -::: -::: - ---- - -![](images/10_Untransformed.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To change the scaling/transformation, we need to click directly on the axis. -::: -::: - ---- - -![](images/10_ClickGrid.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From there, when we click on the drop-down, we see the various transformation options. We will select [Logicle](https://pubmed.ncbi.nlm.nih.gov/16604519/), given we are working with spectral flow cytometry files. -::: -::: - ---- - -![](images/10_SelectLogicle.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This y-axis values are subsequently visualized with the logicle transformation applied, increasing our resolution between the positive and negative population. -::: -::: - ---- - -![](images/10_LogicleY.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can then repeat this for the x-axis, adjusting the fine-tune options for the scaling as needed. -::: -::: - ---- - -![](images/10_DoubleLogicleAxis.png) - ---- - -### Navigating Gating Hierarchy - -::: {.fragment} -::: {.callout-tip title="."} -With this done, let's first draw a rectangle gate for the CD45+ (B4-A) cells. -::: -::: - ---- - -![](images/10_CD45Gate.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And then selecting that population by clicking on the gate name, let's proceed and gate the CD19+ cells (V2-A). -::: -::: - ---- - -![](images/10_CD19Gate.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As you can see, we now have the various gates present in the gating hierarchy for the respective .fcs file. To return to a previous gated population, we would click on the parent population above it. -::: -::: - ---- - -![](images/11_ReturnToPrevious.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can subsequently add an additional gate at this gating level for the likely debris population (the threshold setting was suboptimal for this experimental run). -::: -::: - ---- - -![](images/11_AdditionalGates.png) - ---- - -### Copying Gates - -::: {.fragment} -::: {.callout-tip title="."} -This was the process for gating for a single specimen. To copy gates over to the other specimens, we have two options. First, holding down your Ctrl (or equivalent) button, you can click on the individual gate names. -::: -::: - ---- - -![](images/11_ControlHighlight.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From there, you can drag them down to the next specimen and apply them. -::: -::: - ---- - -![](images/11_ApplyToNext.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, you can drag down the highlighted gated to the Pipelines Tab, and apply to All Files. This will result in the gates being copied to all specimens in the experiment. -::: -::: - ---- - -![](images/11_ApplyAllViaPipelines.png) - ---- - -![](images/13_PipelineAdjustAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Adjustments within Pipelines will carry over to all other respective unmodified specimens that share it’s gates. -::: -::: - ---- - -![](images/13_PipelineAdjustCD19.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, I recommend cycling through the gates for each specimen, just to ensure that the gates were positioned correctly before saving the workspace. -::: -::: - ---- - -![](images/12_ClickAdjust.png) - ---- - -### Saving Workspace - -::: {.fragment} -::: {.callout-tip title="."} -With everyone now "correctly" gated, we can proceed to save the workspace so that we can reopen it later from another browser. - -To do this we open the File tab from the upper navigation bar, and select Save Workspace. -::: -::: - ---- - -![](images/14_SaveWorkspace.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From there we have a couple options, for now let's select Floreada Workspace. Where it is saved at will depend on your individual browser settings, so watch for a popup. -::: -::: - ---- - -![](images/14_FloreadaWorkspace.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively (and crucially for the CytoML pipeline) we can also choose to save it as a FlowJo v10 .wsp file. -::: -::: - ---- - -![](images/14_FlowJoWorkspace.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In both cases, you will end up with Workspace files that can be used later to access your created gates -::: -::: - ---- - -![](images/WorkspaceFiles.png) - ---- - -### Reopening Workspace - -::: {.fragment} -::: {.callout-tip title="."} -To reopen the Floreada workspace within the browser, reopen the website, and select the Open File(s) option. -::: -::: - ---- - -![](images/15_Reopening.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From there, select both the Floreada Workspace file as well as the .fcs files -::: -::: - ---- - -![](images/15_ReopeningSelectAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -At which point you will now be back to the point you last saved at. -::: -::: - ---- - -![](images/15_ReopenedWorkspace.png) - ---- - -## CytoML - -::: {.fragment} -::: {.callout-tip title="."} -Due to a unknown formatting bug, the Floreada produced FlowJo v10 .wsp is not directly accessible by CytoML at the time of this course. However, the issue is resolved as soon as the file is opened the first time within FlowJo v10, regardless of whether you have a log in or not. Strange? Yes, but we will take the workaround. - -So, for anyone on Windows or MacOS, download [FlowJo v10](https://www.flowjo.com/flowjo10/overview). Once installed, open the software, and close the login popups. Once there, open the Floreada created FlowJo.wsp file. Since you haven't logged in, it won't show any events. But it will correct the formatting bug. Close the software, and return to R. Your Floreada sourced .WSP file should now be readable by CytoML. - -Odd? For sure. Fixable? Likely, I will set a reminder to work with the Floreada and CytoML devs to see if we can cut out the need for this workaround. -::: -::: - -# Wrap-up - - -# Additional Resources - -[Floreada Documentation](https://floreada.io/docs/) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using Floreada" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +As a "Cytometry in R" course, we will primarily be working in R. However, within our daily workflows and projects here at our flow cytometry core, we often use various flow cytometry softwares (like [FlowJo](https://flowjo.com/flowjo10/download) or [FCS Express](https://denovosoftware.com/)) for various tasks. Fortunately, R packages like [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) can allow us to import our manually drawn gates from existing FlowJo workspaces so that we can work with them in R. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For this course, we are adamant about staying neutral in regards to both commercial software or instrument vendors as much as possible. If they have worked with the open-source community to make their files readable and accessible via R, we will showcase how to integrate those tools into your own workflows. At the same time, this being a [**free**]{.underline} course, it doesn't make sense to turn around and ask you to go and either free trial or buy an expensive software license just to see how a particular free R package works. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Fortunately, for showing how to use this [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) functionality, we can use [Floreada.io](https://floreada.io/). It is a simple (but free) web-based analysis platform that can be used to draw manual gates for your .fcs files of interest. These can then be saved as Floreada workspaces for later use. We typically recommend it to users from labs that do flow experiments infrequently. Fortunately thanks to the hard work of its [developers](https://floreada.io/about), it can also save the gated files as [FlowJo](https://flowjo.com/flowjo10/download) v10 .wsp files, which with a small workaround become usable within the [CytoML](https://www.bioconductor.org/packages/release/bioc/html/CytoML.html) pipeline. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To facilitate this, we will provide a small walk-through of how to use it for those who want to create a .wsp with their own .fcs files for [Week 5](https://umgcccfcsr.github.io/CytometryInR/Schedule#gating-sets). +::: +::: + +--- + +# Walk-through + +## Floreada + +### Loading Dataset + +::: {.fragment} +::: {.callout-tip title="."} +First, open your web browser and navigate to the [website](https://floreada.io/) + +Click on Start to proceed to the next page. +::: +::: + +--- + +![](images/01_LandingPage.png) + +--- + +![](images/02_InitialPage.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once that is done, select the File tab on the upper navigation bar. Then click on Open File(s). +::: +::: + +--- + +![](images/03_OpenFiles.png){fig-align="left"} + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From there, select your .fcs files of interest, and click Open. +::: +::: + +--- + +![](images/04_SelectFCSFiles.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The .fcs files will now load in, and you should see a view similar to the one below. On the left side-bar, you have your gating options (Rectangle, Polygon, Range, Elipse, Quad, etc). Next to these on the right you have the FCS files that are loaded into the workspace. Then on the right, you have the visual display for your selected specimen. +::: +::: + +--- + +![](images/05_InitialFiles.png) + +--- + +### Switching Axis Markers + +::: {.fragment} +::: {.callout-tip title="."} +If you left click on the axis name (SSC-H or FSC-H in this case), you will be able to select other markers by which to gate your specimen. For the provided example, we were using a raw spectral flow cytometry .fcs file, so the names of the detectors are present. +::: +::: + +--- + +![](images/06_LeftClick.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For now, I plan to start off by gating for singlets. I switch the y-axis to FSC-H, and then proceed to switch the x-axis to FSC-A. +::: +::: + +--- + +![](images/07_LeftClickXaxis.png) + +--- + +### Creating Gates + +::: {.fragment} +::: {.callout-tip title="."} +With this done, I can now select the Poly gate tab on the upper left. +::: +::: + +--- + +![](images/08_PolygonGateSelect.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then manually click on the locations on the plot to add the individual gate nodes. +::: +::: + +--- + +![](images/08_PolygonGateStart.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To complete the gate, I click back to the original node point. At this point, the popup will allow you to name the gate. +::: +::: + +--- + +![](images/08_PolygonGateCreate.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To adjust the polygon gate, you can click on a node and drag it to expand or contract in a particular direction +::: +::: + +--- + +![](images/08_PolygonGateNode.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To move the entire gate, first click on a node to select the gate, then click in the center of the gate to adjust its location. +::: +::: + +--- + +![](images/08_PolygonGateCenter.png) + +--- + + +### Additional Gates + +::: {.fragment} +::: {.callout-tip title="."} +Unfortunately for those with the force-of-habit from using other softwares, double-clicking within the gate doesn't do anything. To continue gating on the selected cells, you will need to click on the newly created gate name on the left. This will result in visualizing the isolated cells. +::: +::: + +--- + +![](images/09_SecondLanding.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, you can repeat the previous steps to change the axis markers and create a second gate. For this example, we went with a "Cells" gate to exclude debris from this particular sample. +::: +::: + +--- + +![](images/09_SecondGate.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having created the "Cells" gate, we will be switching gating based on FSC and SSC to using the detector parameters. + +The samples in this example were acquired to derive the cell counts and concentration of various cell populations within cryopreserved cord and peripheral blood mononuclear cells (CBMC and PBMC) specimens after thawing. + +They were stained with CD19 BV421, CD45 PE, and CD14 APC on a [5-Laser Cytek Aurora](https://spectrum.cytekbio.com/), before unmixing, this would correspond respectively to V1, YG1/B4, R1/YG4 peaks respectively. +::: +::: + +--- + +### Scaling/Transformation + +::: {.fragment} +::: {.callout-tip title="."} +When we switch the axis, we can see that the scaling/transformation is not ideal, as the staining and not-staining populations are scrunched up together in the center of the plot. +::: +::: + +--- + +![](images/10_Untransformed.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To change the scaling/transformation, we need to click directly on the axis. +::: +::: + +--- + +![](images/10_ClickGrid.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From there, when we click on the drop-down, we see the various transformation options. We will select [Logicle](https://pubmed.ncbi.nlm.nih.gov/16604519/), given we are working with spectral flow cytometry files. +::: +::: + +--- + +![](images/10_SelectLogicle.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This y-axis values are subsequently visualized with the logicle transformation applied, increasing our resolution between the positive and negative population. +::: +::: + +--- + +![](images/10_LogicleY.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can then repeat this for the x-axis, adjusting the fine-tune options for the scaling as needed. +::: +::: + +--- + +![](images/10_DoubleLogicleAxis.png) + +--- + +### Navigating Gating Hierarchy + +::: {.fragment} +::: {.callout-tip title="."} +With this done, let's first draw a rectangle gate for the CD45+ (B4-A) cells. +::: +::: + +--- + +![](images/10_CD45Gate.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And then selecting that population by clicking on the gate name, let's proceed and gate the CD19+ cells (V2-A). +::: +::: + +--- + +![](images/10_CD19Gate.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As you can see, we now have the various gates present in the gating hierarchy for the respective .fcs file. To return to a previous gated population, we would click on the parent population above it. +::: +::: + +--- + +![](images/11_ReturnToPrevious.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can subsequently add an additional gate at this gating level for the likely debris population (the threshold setting was suboptimal for this experimental run). +::: +::: + +--- + +![](images/11_AdditionalGates.png) + +--- + +### Copying Gates + +::: {.fragment} +::: {.callout-tip title="."} +This was the process for gating for a single specimen. To copy gates over to the other specimens, we have two options. First, holding down your Ctrl (or equivalent) button, you can click on the individual gate names. +::: +::: + +--- + +![](images/11_ControlHighlight.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From there, you can drag them down to the next specimen and apply them. +::: +::: + +--- + +![](images/11_ApplyToNext.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, you can drag down the highlighted gated to the Pipelines Tab, and apply to All Files. This will result in the gates being copied to all specimens in the experiment. +::: +::: + +--- + +![](images/11_ApplyAllViaPipelines.png) + +--- + +![](images/13_PipelineAdjustAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Adjustments within Pipelines will carry over to all other respective unmodified specimens that share it’s gates. +::: +::: + +--- + +![](images/13_PipelineAdjustCD19.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, I recommend cycling through the gates for each specimen, just to ensure that the gates were positioned correctly before saving the workspace. +::: +::: + +--- + +![](images/12_ClickAdjust.png) + +--- + +### Saving Workspace + +::: {.fragment} +::: {.callout-tip title="."} +With everyone now "correctly" gated, we can proceed to save the workspace so that we can reopen it later from another browser. + +To do this we open the File tab from the upper navigation bar, and select Save Workspace. +::: +::: + +--- + +![](images/14_SaveWorkspace.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From there we have a couple options, for now let's select Floreada Workspace. Where it is saved at will depend on your individual browser settings, so watch for a popup. +::: +::: + +--- + +![](images/14_FloreadaWorkspace.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively (and crucially for the CytoML pipeline) we can also choose to save it as a FlowJo v10 .wsp file. +::: +::: + +--- + +![](images/14_FlowJoWorkspace.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In both cases, you will end up with Workspace files that can be used later to access your created gates +::: +::: + +--- + +![](images/WorkspaceFiles.png) + +--- + +### Reopening Workspace + +::: {.fragment} +::: {.callout-tip title="."} +To reopen the Floreada workspace within the browser, reopen the website, and select the Open File(s) option. +::: +::: + +--- + +![](images/15_Reopening.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From there, select both the Floreada Workspace file as well as the .fcs files +::: +::: + +--- + +![](images/15_ReopeningSelectAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +At which point you will now be back to the point you last saved at. +::: +::: + +--- + +![](images/15_ReopenedWorkspace.png) + +--- + +## CytoML + +::: {.fragment} +::: {.callout-tip title="."} +Due to a unknown formatting bug, the Floreada produced FlowJo v10 .wsp is not directly accessible by CytoML at the time of this course. However, the issue is resolved as soon as the file is opened the first time within FlowJo v10, regardless of whether you have a log in or not. Strange? Yes, but we will take the workaround. + +So, for anyone on Windows or MacOS, download [FlowJo v10](https://www.flowjo.com/flowjo10/overview). Once installed, open the software, and close the login popups. Once there, open the Floreada created FlowJo.wsp file. Since you haven't logged in, it won't show any events. But it will correct the formatting bug. Close the software, and return to R. Your Floreada sourced .WSP file should now be readable by CytoML. + +Odd? For sure. Fixable? Likely, I will set a reminder to work with the Floreada and CytoML devs to see if we can cut out the need for this workaround. +::: +::: + +# Wrap-up + + +# Additional Resources + +[Floreada Documentation](https://floreada.io/docs/) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Git/.DS_Store b/course/00_Git/.DS_Store deleted file mode 100644 index 084a051..0000000 Binary files a/course/00_Git/.DS_Store and /dev/null differ diff --git a/course/00_Git/index.qmd b/course/00_Git/index.qmd index 6f44485..5835d1a 100644 --- a/course/00_Git/index.qmd +++ b/course/00_Git/index.qmd @@ -1,899 +1,899 @@ ---- -title: "Version Control with Git" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 5 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/mw6Trvv3Pqg?si=vx6yEaXGpYbtq3DY) - - - -For screen-shot slides, click [here](/course/00_Git/slides.qmd) - - -# Background - -Now that we have created a [GitHub account](/course/00_GitHub/index.qmd), installed the required [software](/course/00_WorkstationSetup/index.qmd) and investigated [Positron's](/course/00_Positron/index.qmd) layout, we will start learning about version control software. - -When working with code, it is important to stay organized. Ideally, everything needed for your code to successfully run should be present and accounted for within the local environment. Likewise, if you make changes, and your code stops working (no longer returning the expected output, ie. breaks), it would be most useful to have a track record of what has changed since your last working version in order to fix the issue. For beginners, this is often a typo in a function name or a misplaced comma somewhere within your document. - -For this course, we will be using the version control software [Git](https://git-scm.com/). It is widely used by software developers and bioinformaticians worldwide, and is a very useful tool to have in your coding toolbox. - -Git works locally within your individual project folders to track changes to the documents within, allowing to save the current state of the folder along the way (ie. a commit). This allows you to compare to previous versions (other commits) and return the changes that have occured to the tracked files. - -As we saw during the [workstation setup](/course/00_WorkstationSetup/index.qmd) section, when you have a linked GitHub account, you can backup folders as repositories online. By leveraging the ability to send and receive changes, this allows you to modify a file on one computer, - - Individual repositories can be linked to a GitHub account, which permits them to be backed up online. Within our workflow, this allows to modify on one computer, back up (ie. push) the changes to GitHub, and then later on a different workstation, retrieve (ie. pull) these new changes and continue working. - - In this walk-through, we will set up a New Project Folder from a template, create a few folders and files, and work through how to use the main set of Git commands needed for this course. - - -# Getting Started - -For this walkthrough, we are going to create a brand new project folder. To do this, we can open the folder tab on the upper right. - -From here we can see we have two options, create a "New Folder from a Template", and create a "New Folder from Git" (which was the option we used during [workstation setup](/course/00_WorkstationSetup/index.qmd) to bring in the forked CytometryInR and README repository folders locally). - -We will go ahead and select "New Folder from a Template" for this example. - -![](images/1.png) - -
- ---- - -## New Folder from Template - -Since Positron can use multiple programming languages, when we select "New Folder from Template" we will be asked what kind of folder template we want to use. Since we are working in R, we will select the "R Project" option. - -![](images/2.png) - -
- ---- - -We will next be asked to name the new project folder and a storage location. - -One thing I would like to remind everyone who is just starting to code is that it is best to avoid using [special characters](https://en.wikipedia.org/wiki/Regular_expression) (ex. @ $ # ^ ! ; : ,) in any folder or file name. This is because when coding, these can be misinterpreted as commands. - -While spaces are generally okay, it is often to best stick to to stick to hyphens (-), underscores (_). We will explore naming conventions in more depth at a later time. - -![](https://pbs.twimg.com/media/FxVpCpqaIAE_iqU?format=jpg&name=small) - -
- ---- - -Another useful thing to know when getting started with version control, it is best to save your files within your local computer, avoid using OneDrive or other cloud storage options for the time reason. The reason behind is that permissions to write/save to the cloud locations can sometimes be quite finicky, and some autosave/indexing behaviors can cause issues. akes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. - -Having named our new Project Folder, and designated a storage location, go ahead and check the Initialize Git Repository option. This will indicate to version control to monitor content and changes to files within this folder. - -![](images/3.png) - -
- ---- - -The next setup screen will verify which version of R you wish to use. Since we are just getting started, your most recent version of R (usually system) should work. We will also leave the "renv" (reproducible environment setup) option unchecked for the time being (we will revisit the concept later in the course). - -![](images/4.png) - -
- ---- - -And if all goes well, we should see the "New Folder Created" popup. - -![](images/5.png) - -
- ---- - -## Creating SubFolders - -Once your new project folder has opened, you should be seeing the main layout elements that we briefly covered in the [Positron](/course/00_Positron/index.qmd) walk-through. - -For this section, we will primarily be focused on what is happening within the primary side bar on the left, where changes to the individual files within the folder since the last save/commit will be reflected by colored text. - -For my own projects, there are some elements of organization that I go ahead and add for each new folder. These include both a data and an images subfolders to help keep things a little more organized. - -To create these folders, we would click on the respective add folder (+) button on the side bar. Files and Folders can be clicked and dragged within the primary side bar to move things to new folder locations. - -![](images/6.png) - -
- ---- - -## Creating Files - -In context of this course, we will primarily be working with two types of files when coding: - -- R Scripts: These files end in .R. These contain only code (with occasional \# comment line). These are often used for self-contained code that once we get them working we rarely need to modify. - -- Quarto Markdowns: These files end in .qmd. They contain a .yaml header, followed by a mix of regular written text (often explanations or other documentation), and sections (ie. chunks) that contain code. These are used when we are still getting the code to work, when we need to modify inputs frequently, or simply when we need to document what and why we are doing something to make life easier for our future-self two months from now. - -
- ---- - -In this example, I will go ahead and select the new file icon - -![](images/7.png) - -
- ---- - -Thenn I will name the file, and designate it as a Quarto Markdown file by adding the .qmd at the end of the name to denote the file type. - -![](images/8.png) - -
- ---- - -## QMD Files - -Once this is done, we can now see we have a new .qmd file ("Example.qmd" in this case). - -### YAML - -As previously mentioned, the start of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file containg a [YAML](https://quarto.org/docs/authoring/front-matter.html) code chunk that is used to set formatting choices (we will explore this in-depth during the [next section](/course/00_Quarto/index.qmd)) - - -What designates the location of the YAML block are three hyphens at the start, and three hyphens at the end. For this example, we will also provide a "title:" and "format:" field for the time being (see additional options [here](https://quarto.org/docs/authoring/front-matter.html)). - -![](images/9.png) - -
- ---- - -### Text - -With a basic YAML formatting block now in place, we can build out other elements of our Quarto Markdown document. Unless otherwise specified, everything else in the document is assumed to be text, so I will go ahead and provide an initial text description of what I am trying to do. - -![](images/10.png) - -
- ---- - -### Code-Chunks - -Having provided some initial text for documentation, we can then add code-block chunks to start writing some code. - -The easiest way to do do this is to click the respective option on the upper-right of the Editor screen. Since Positron can handle multiple programming languages, so the chunk is inserted, we will need to select the language we use to be used within the code chunk (R in this case). - -![](images/11.png) - -
- ---- - -You will notice, that the inserted code block starts off with three backticks (\`) and then "{r}". The end of the code block is denoted by an additional three backticks. - -We can also add new code blocks by simply typing these elements into the location we want to place a code chunk (as long as we are careful to add 3 backticks also at the end). - -![](images/12.png) - -
- ---- - -![](images/13.png) - -
- ---- - -### Running Code - -Now that we have two code-chunks written, we can write lines of code within them. For this example, I will use two beginner friendly functions, print("Hello"), which will print the contents contained between the " " to the console, and getwd() which will return the location of the folder you are working within (ie. the working directory). - -To run/execute these lines of code, we have a couple options. We can click on the Run Cell option that appears on the upper-left side of the code chunk. Additionally, it has a companion option that will run all code chunks above it. - -![](images/14.png) - -
- ---- - -When a code block is successfully run, you will see within the console (lower bottom of the screen) the line of code be run, with any returned outputs appear directly after. - -![](images/15.png) - -
- ---- - -An alternative to clicking the Run Cell button is to click on the line of code you are interested in running, then press (Ctrl + Enter)/(Command + Enter). This will execute the line of code that you have clicked on. This can be useful in scenarios where you want to run a specific line, and not the entire code-chunk. - -![](images/16.png) - -
- ---- - -Using this approach, you can see the location (ie. file path) of the current working directory was returned to the Console. - -![](images/17.png) - -
- ---- - -## Local Version Control - -Having introduced the main elements of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file, let's turn our attention to the tab within the editor showing our newly created .qmd file. - -We can see there is a solid circle next to the file name, and it is appearing as green. The circle denotes unsaved changes, which we can correct by clicking on the Save Button to save the changes to our file. - -![](images/18.png) - -
- ---- - -### Untracked - -If we turn our attention to the left primary sidebar, we can see that within our GitPractie folder there are three files, our Example.qmd, and the default README.md and .gitignore files. These all show up in green text with U's to the right of the file names. - -This denotes that the version control tracking software Git is currently considering them as "Untracked" files. While saving the document via the Save button means we will still have our changes when we reopen Positron, we won't have any history of changes that we can use to revert back to the way all the files appeared at this exact point in time should something go wrong. - -We will next go the address bar on the very far left, and select the Git tab. - -![](images/19.png) - -
- ---- - -On the Git tab, we can see that each of the three files are shown underneath a "Changes" drop-down. This contains the files that have undergone changes since the last commit. In our case, since we haven't updated the save-state yet, this last commit would be the initial creation of the project folder. - -![](images/20.png) - -
- ---- - -To have version control track these individual files going forward, we can do so in two separate ways. We can add them individually by clicking the + symbol next to the individual names. - -![](images/21.png) - -
- ---- - -### Staged - -This will result in the files being moved to the "Staged" dropdown. This denotes files being tracked with the intention of being recorded as the next save-state or waypoint (ie. a commit). - -![](images/22.png) - -
- ---- - -### Commit - -To create a new commit (save-state or waypoint), once we have the files we want to track staged, we will write a commit message, and then press commit. - -A commit message is a brief description of the changes that have occurred to the files between this commit and the previous one. Make this short description informative enough that if you need to revert back in the future, you can quickly identify the commit you need to fall back to (more about this later). - -![](images/23.png) - -
- ---- - -If this your first time using version control, you will likely encounter the following pop-up asking that you provide a user.name and user.email. This is used to designate the author of the changes.If you get this popup, go ahead and select "Open Git Log" - -![](images/24.png) - -
- ---- - -### UserName and UserEmail - -The Output tab at the bottom of the screen will open, showing the messages that led to the popup. - -The important part to note is the commands that will be needed to provide your user name and email to the computer for authoring the commit. Typically, your email will be the same one you used for your GitHub account. - -![](images/25.png) - -
- ---- - -From the displayed message, go ahead and copy - -"git config –global user.email "you\@example.com"" - -Then click on the adjacent terminal tab. You will paste the command in, but do not hit enter just yet. - -Windows users, please note, depending on your settings, if trying to paste from the keyboard into the terminal, you may need to press "Ctrl + Shift + V" instead of the usual "Ctrl + V". - -![](images/26.png) - -
- ---- - -With the command now pasted (or typed), use your keyboard arrows to navigate to the email portion, and replace the generic email with your email address used for your GitHub account. - -Make sure that the quotation marks (") around the email address remain present, as they help the computer identify where your email address starts and ends. Once satisfied that your email address is correct, press enter. - -![](images/27.png) - -
- ---- - -Next up, repeat the process, this time copying over the command needed to set your user name to the terminal. Repeat the editing process to provide your name between the "" marks. Then press enter. - -![](images/28.png) - -
- ---- - -![](images/29.png) - -
- ---- - -### First Commit - -Now that your user.name and email address have been provided, Git should be able to provide an author to the commit message. Reattempt to press commit button. - -If this is successful, you will see your initial commit appear on the bottom half of the left primary side bar, under the Graph dropdown. Congrats! Your files are now being tracked by version control. - -![](images/30.png) - -
- ---- - -If you hover with your mouse arrow just over the commit, you can see the longer commit message and additional details appear. - -If you click on the commit tab, a new display will open in the editor, displaying the changes that occured in that commit compared to the previous one. In this case, since we added everything since the previous commit, nothing appears on the left side, while the entire documents contents appear highlighted in green on the right. - -Green highlighting is used to show additions, while red highlighting is used to show deletions. - -![](images/31.png) - -
- ---- - -Having completed this initial commit, for this example, let's imitate a typical workflow and make some additional changes to the file before we make a second commit. Within text portions of the .qmd file, use of \# denotes a section header in markdown, so let's add a header for Introduction and click save. - -![](images/32.png) - -
- ---- - -### Modified - -Within the left primary sidebar, we can see that the Git tracking has updated. Examples.qmd is visible once again. However, becuase it is now a tracked file, instead of showing up with the "U/Untracked" green highlight, it now appears as a brownish-red with a "M/Modified". - -Let's make an additional change to the .qmd file by adding another section (# Setup) and a code block with a commented out line (denoted by the \# at the line start), before pressing Save. - -![](images/33.png) - -
- ---- - -If we were now to click on the Example.qmd file in the left primary sidebar, it will open the same kind of tracking display we saw previously. This time, we can see changes since our last commit. These appear as the green highlights along the scroll-bar, corresponding to the \# Introduction and \# Setup headers that we have added in since the last commit. - -![](images/34.png) - -
- ---- - -For a larger document, we can scroll down to see the various highlighted regions. - -![](images/35.png) - -
- ---- - -We could now repeat the steps showed above, staging the file, writing a commit message, and commiting again by clicking on the designated buttons. - -An important question is how often should we commit, vs. just hit save? Well... it depends :D -Let's think about this in context of a video game. If you made commits at regular intervals throughout the day (or more frequently when doing something particularly risky), you are more likely to be close enough to a particular commit (waypoint/save-state) that you can quickly revert back to without loosing any progress. Alternatively, if your last commit was last week, you will not have any intermediate versions to fall back to. - -### Commit via Terminal - -Having demonstrated how to commit changes to Git via the left primary side-bar, for this second commit, let's do it the alternate way via the terminal (tab on the panel at the bottom of your screen). - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -
- ---- - -After clicking on the terminal tab, click on blinking command line. - -The command to stage a file is "git add ", followed by the name of the file you want to stage. - -In this case, you would enter "git add Example.qmd" and press Enter. -![](images/36.png) - -
- ---- - -You will see after pressing enter a new blank terminal line appear. If you glance at the left-sidebar, you can see that Example.qmd now appears under the Staged Changes dropdown. - -![](images/37.png) - -
- ---- - -Next up, let's write the git commit via the terminal. In this case, the command would be "git commit -m " (-m denoting message). The commit text is then surrounded by "" marks. - -For example: "git commit -m "Added section headers to my QMD file"" - -Press enter to save the commit. - -![](images/38.png) - -
- ---- - -And you should see your second commit now appear in the left primary sidebar underneath the graphs dropdown. - -![](images/39.png) - -
- ---- - -## Remote Version Control - -### Copying Project Folder to GitHub - -While having local version control in place is helpful when you need to revert back after encountering issues, where Git shines is the ability to pass your changes to your online GitHub repository. - -Not only does this allow you to switch between computers, but should something disastrous happen to your main computer, you still have all your hard work backed up and readily assessible. - -For this subsection, first, double check that Positron is still connected to your GitHub account by checking the user tab on the bottom-left. If not, repeat the [connection setup](/course/00_WorkstationSetup/Windows.qmd#connecting-github-and-positron). - -![](images/40.png) - -
- ---- - -Since our project was created using the "New Folder from Template" option, it currently only exist locally. What we want to do next is to copy it to our GitHub account, creating a new repository in the process. - -To do this, we will first need to install the `usethis` R package. Within your console, you would run the following line of code: - -```{r} -#| eval: false -install.packages("usethis") -``` - -Depending on what R packages you already have installed on your computer, you may get a prompt asking if you want to update/install additional dependencies. Go ahead and type the number corresponding to Update All, and press enter. - -The package and all it's dependencies should then install. If an error message appears, read through it, and follow provided instructions. Go to [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) -if need help. - -
- ----- - -Once the `usethis` package is installed, we need to activate it within R by calling it with the library command. This makes all the tools (ie. functions) within an R package available for use within Positron. - -In your console, you would type: - -```{r} -#| eval: FALSE -library(usethis) -``` - -![](images/46.png) - -
- ---- - - -With library called, you now have access to the functions (tools) within the `usethis` R package. One of these is the `use_github()` function. - -In Positron, if you hover over a function, it will pull up the associated help file which will provide you information about the arguments the function expects to receive, and what they do. - -For `use_github()`, the main thing to remember for now is since this is a personal project being used for testing, we don't necessarily want to share it with the entire world, so we should set the "private" argument equal to TRUE when creating a new repository. - -![](images/46.png) - -
- ---- - -Taking this information that we have now gathered, we can now within our Quarto Markdown create a code chunk, write out the line of code calling the function, and providing the Private=TRUE argument within the (). - -Within a code chunk, adding a \# in front of a line of code, will comment it out, resulting in that line of code not being run. Since we have already installed the `usethis` package, and we don't want to reinstall it every single time, let's go ahead and comment out that line. Go ahead and press Enter. - -![](images/47.png) - -
- ---- - -We will see a message pop-up in the console. In this case, we had not saved before pressing enter, so there are uncommitted changes within the folder. The pop-up is asking whether you want to save these as well before sending the Folder to GitHub. - -In this case I will chose to ignore the uncommitted changes by entering 3 (for Definitely) in the console and hitting enter on my keyboard. - -![](images/48.png) - -
- ---- - -The `usethis` R package will then execute the series of git commands that are needed to set up a GitHub repository (ie. the messages being displayed in the console window), and when finished will open a pop-up asking whether you want to see your new repository in your default Web Browser. I will go ahead and select yes in this case. - -![](images/49.png) - -
- ---- - -After the browser opens, you can see that the elements I had staged and committed within Positron are now present within the GitHub repository. -Since I had only staged Example.qmd, it is the only file that was backed up. We can also see the commit history online by clicking on the commit clock. - - -![](images/50.png) - -
- ---- - -As we would expect, we only see our two commit messages. One important thing to note is the commit hash numbers, that denote a particular commit. If we decided to revert/fall back to a prior commit in the future, this would be the number we would need to provide to Git to return to that previous commit/save-state - -![](images/51.png) - -
- ---- - -Similarly, on GitHub, we have an option to Browse a Repository at a particular point in time. This will be quite useful later in the future when troubleshooting what major changes occurred between versions of an R package. - -![](images/52.png) - -
- ---- - -### Code Chunk Arguments - -Having successfully connected our local Project Folder to a remote GitHub repository, let's return to Positron. - -Before continuing, if we left the code chunk that created the GitHub repository as is, every time we ran all code chunks in the document, it would try to recreate the GitHub repository. We don't want this to happen, as the setup was a one-time operation. - -While we could add \# in front of every line of code (or delete the code chunk entirely) it is often useful to have these set-up code chunks around to remind us what arguments we need to provide next time we need to a similar setup and are mind blanking on what to do. - -Fortunately, Quarto allows us to set conditions on whether a chunk is run (ie. evaluated). We will discuss the conditiona arguments in more depth in the [next section](/course/00_Quarto/index.qmd), but for now, we can modify the code chunk as follows. - - -On the next line after the {r}, we will add a hashtag (\#), then a pipe (|), followed by a space. This is the setup for a code-chunk specific argument. We will then add "eval: FALSE", which signals that the particular code-chunk should not be evaluated (ie, should not be run). - -![](images/53.png) - -
- ---- - -### README - -Now that we have connected our local Project Folder to GitHub, and have gotten a basic introduction to the "git add", "git commit" arguments, let's turn our focus to the other files currently listed as untracked by Git within our folder, the README.md and the .gitignore files. - -When setting up our [GitHub]() account, we encounted an example of a README.md file. This file often provides a brief description of the project, and an outline of what the other files in the folder are for. As you may have gathered, even software developers are forgetful/under-caffenaited, and having notes to catch back up to speed is important. - -![](images/54.png) - -
- ---- - - -### .gitignore -We additionally have a .gitignore file. Within a project, there are often some files that we will never want version control to track. These could be files that are too large for GitHub (ex. really large .fcs files), or files containing sensitive information (passwords, history, credentials, etc.). - -When the names of these file (or the file type shothand) are added to the .gitignore file, they are ignored by version control, and no longer appear on the primary left side bar. - -![](images/54.png) - -
- ---- - -Let's proceed and stage both the README.md and .gitignore file, so that changes to these files will be tracked. We can of course select both from the primary left side bar and write a short commit message. - -![](images/55.png) - -
- ---- - -![](images/56.png) - -
- ---- - -Or alternatively, if we want to stage all uncommitted files present in a single step, we could in the terminal use the "git add ." - -We can then write our git commit using "git commit -m". - -Both approaches work, and you may switch between them based on preferrence. - -![](images/57.png) - -
- ---- - -You will notice after having committed, that if you look at the Graph dropdown on the bottom half of the primary left side-bar that something has changed. - -There are now separate icons denoted as main and origin/main. These correspond to the last commit present locally (main), and the last commit on remote (ie. GitHub, origin/main). - -Local is ahead since you just made the commit with the changes inactivating the code-chunk, and you have not passed these changes up to GitHub yet. - -![](images/58.png) - -
- ---- - - -### Pull - -Before sending (ie. pushing up) our updated commit to GitHub, especially if you are working on a project from multiple computers (or as part of a team) to bring in (ie. pull down) any changes that might be on GitHub that are not present locally. - -This ensures that everything is up to date, and you don't end up with mismatched commits that are incompatible with each other and trigger an error message. - -To pull in changes from GitHub, at the top of the primary left side-bar, you can select the ... button to open a drop-down menu of Git options. You would then select "Pull". - -Alternatively, you could do the same thing via the terminal by running the "git pull" command. - -![](images/59.png) - -
- ---- - -### Push - -In our case, there was no new material present on our GitHub repository that were not already present locally, so all that is returned is the "Already up to date" message. - -We are now good to proceed to push (ie. send) the updated commit up to our GitHub repository. - -We can do this by either pressing the Sync changes button, or via the terminal entering the "git push" command. - -![](images/60.png) - -
- ---- - -And now, if you glance down at left side-bar's graph section, you will see that both the main and origin/main icons are now present for the most recent commit. - -![](images/61.png) - -
- ---- - -If we switch to our Web browser, we can see that this is also now the case for our GitHub repository that now also has the most recent changes. - -![](images/62.png) - -
- ---- - -### Reverting to Prior Commit - -For most daily-workflows, you will only need the git commands that we have introduced above (git add, commit, pull, push). The next two areas (reverting to a prior commit, and branches) are more specialized, and will be covered in greater depth later in the course. We are briefly covering them here. If you are at the point where your last remaining neuron has disconnected, and you feel you need to take a break from version control, feel free to skip to the [next section](/course/00_Quarto/index.qmd) and we will revisit these topics later in the course. - -
- --- - -In most cases, if your code stops working, you can identify the issue and fix it in the existing version, never needing to resort to reverting to a previous commit (save-state). The times you would need to revert would be if you deleted important files, or the new files are hopeless mess that is not worth trying to sort through. In those cases, reverting back might be better approach. - -To imitate a falling back scenario, lets create and additional file, stage and commit it to end up a commit ahead of where we are currently at within the Project Folder. - -![](images/00_RevertTest.png) - - -
- ---- - -Now being one (or several) commits ahead, if we wanted to revert back, we would first need to identify the commit we want to revert back to and copy the commit hash number. - -![](images/00_CommitHash.png) - - -
- ---- - -Then, opening the terminal, we can enter "git reset " and paste the hash afterwards. We can then press enter. - - -![](images/00_GitReset.png) - - -
- ---- - -You will notice our additional commit has been removed, although the newer files we were working on subsequent last commit are still present. - - -![](images/00_GitResetExecuted.png) - - -
- ---- - -If however, we had wanted to return to the exact same state as the previous commit (removing all subsequent created files), we could do so by adding in the --hard argument. Before starting, save any newer files you want to keep in a completely different folder, because they will be permanently removed. - -Then, enter "git reset --hard thecommithashnumber" into the terminal, which would result in a "hard" return to the previous commits save-state. You may need to close and reopen Positron to see the changes reflected. - - -### Branches - -Branches are an useful Git feature that we will start using extensively later in the course. Branching allows you to create a parallel/carbon-copy of your existing repository, which you can then edit without affecting the main branch. This is particularly useful for projects that may get messy or drawn out. By isolating these edits to a parallel branch, if they don't work, your main branch remains safe. Alternatively, if you like the changes that occurred in the branch, you can pull these changes from the branch back to main, bringing the timelines back together. - -![](https://book.the-turing-way.org/build/sub-branch-491000deab04cb25ea703c007e2ebdd2.png) - ---- - -Within the terminal, entering "git branch" will show the existing branches. In this case, only main is present since we haven't yet created a new branch. - - -![](images/00_Branch.png) - -
- ---- - -We can create a new branch in the terminal by entering "git branch " followed by the name of our desired branch. In this case, we are creating a branch called Week1 - -![](images/00_Week1.png) - -
- ---- - -Now, when we check "git branch" again in the terminal, which returns the two branches, Week1 and main. The \* is located next to main, indicating that we are currently within the main branch. - -![](images/00_Branches.png) - -
- ---- - -Besides the terminal, we can also create a new branch via Positron. To do so, we first click on the Git tab in the Actions Bar. - -Once the left-side bar displays the version control display, we can click on the ... button (to the right of changes)to gain access to the Git options drop-down. - -From here, we click on Branch, and then select Create Branch. - -![](images/00_BranchesGUI.png) - -
- ---- - -Using Git branch, we saw that we were still within the main branch. In the terminal, we can switch over to the Week1 branch by using the "git checkout " command, followed by the branch we wish to switch to. - -![](images/00_Checkout.png) - -
- ---- - -This results in us switching over to the Week1 branch. - -![](images/00_CheckoutOutput.png) - -
- ---- - -Having switched (ie. checkout) to the Week 1 branch, let's create the file BranchTest.qmd, which will exist within this branch, but not yet in the main branch. - -![](images/00_BranchTest.png) - -
- ---- - -Having created the file, let's stage and then commit it. This will put the Week1 branch ahead of the main branch by a single commit. - -![](images/BranchCommit.png) - -
- ---- - -With our changes staged and committed, if we look at the left side-bar's graph section, our Week1 branch is now ahead of the origin/main branch by one commit. - -![](images/00_BranchToOrigin.png) - -
- ---- - -If we were to check on GitHub, we can see that no new files are present on the main branch, but can see the notification listing recent changes to Week1 branch. - -![](images/00_GitHub.png) - -
- ---- - -Using the drop-down, we can switch from displaying the main branch to the Week1 branch, where we can see the new file. - -![](images/00_GitHubWeek1.png) - -
- ---- - -If we click the green compare and pull request button, we end up on this screen. This compares how the two branches are different from each other. - -![](images/00_GithubWeek1Merge.png) - -
- ---- - -We will delve into branches again at a later point. For now, remember that by creating and prunning parallel branches, you can develop knowing that even if something goes wrong, your main branch remains safe. - - -# Wrap-Up - -In this section, we saw how to create a New Project Folder, create files and back up the project folder to GitHub. We also started learning about git, covering the basic commands (git add, commit, pull, push). If you feel a bit overwhelmed, please know, that is normal. Understanding how to leverage git takes time and practice, but is an incredibly valuable skillset to have in the long run. - -In the [next section](/course/00_Quarto/index.qmd), we will look at how by changing various elements within our .qmd file produce a variety of files, and how to leverage code-chunk arguments to fine-tune whether a code-chunk is utilized. - - -# Additional Resources - -[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) - -[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) - -[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Version Control with Git" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/mw6Trvv3Pqg?si=vx6yEaXGpYbtq3DY) + + + +For screen-shot slides, click [here](/course/00_Git/slides.qmd) + + +# Background + +Now that we have created a [GitHub account](/course/00_GitHub/index.qmd), installed the required [software](/course/00_WorkstationSetup/index.qmd) and investigated [Positron's](/course/00_Positron/index.qmd) layout, we will start learning about version control software. + +When working with code, it is important to stay organized. Ideally, everything needed for your code to successfully run should be present and accounted for within the local environment. Likewise, if you make changes, and your code stops working (no longer returning the expected output, ie. breaks), it would be most useful to have a track record of what has changed since your last working version in order to fix the issue. For beginners, this is often a typo in a function name or a misplaced comma somewhere within your document. + +For this course, we will be using the version control software [Git](https://git-scm.com/). It is widely used by software developers and bioinformaticians worldwide, and is a very useful tool to have in your coding toolbox. + +Git works locally within your individual project folders to track changes to the documents within, allowing to save the current state of the folder along the way (ie. a commit). This allows you to compare to previous versions (other commits) and return the changes that have occured to the tracked files. + +As we saw during the [workstation setup](/course/00_WorkstationSetup/index.qmd) section, when you have a linked GitHub account, you can backup folders as repositories online. By leveraging the ability to send and receive changes, this allows you to modify a file on one computer, + + Individual repositories can be linked to a GitHub account, which permits them to be backed up online. Within our workflow, this allows to modify on one computer, back up (ie. push) the changes to GitHub, and then later on a different workstation, retrieve (ie. pull) these new changes and continue working. + + In this walk-through, we will set up a New Project Folder from a template, create a few folders and files, and work through how to use the main set of Git commands needed for this course. + + +# Getting Started + +For this walkthrough, we are going to create a brand new project folder. To do this, we can open the folder tab on the upper right. + +From here we can see we have two options, create a "New Folder from a Template", and create a "New Folder from Git" (which was the option we used during [workstation setup](/course/00_WorkstationSetup/index.qmd) to bring in the forked CytometryInR and README repository folders locally). + +We will go ahead and select "New Folder from a Template" for this example. + +![](images/1.png) + +
+ +--- + +## New Folder from Template + +Since Positron can use multiple programming languages, when we select "New Folder from Template" we will be asked what kind of folder template we want to use. Since we are working in R, we will select the "R Project" option. + +![](images/2.png) + +
+ +--- + +We will next be asked to name the new project folder and a storage location. + +One thing I would like to remind everyone who is just starting to code is that it is best to avoid using [special characters](https://en.wikipedia.org/wiki/Regular_expression) (ex. @ $ # ^ ! ; : ,) in any folder or file name. This is because when coding, these can be misinterpreted as commands. + +While spaces are generally okay, it is often to best stick to to stick to hyphens (-), underscores (_). We will explore naming conventions in more depth at a later time. + +![](https://pbs.twimg.com/media/FxVpCpqaIAE_iqU?format=jpg&name=small) + +
+ +--- + +Another useful thing to know when getting started with version control, it is best to save your files within your local computer, avoid using OneDrive or other cloud storage options for the time reason. The reason behind is that permissions to write/save to the cloud locations can sometimes be quite finicky, and some autosave/indexing behaviors can cause issues. akes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. + +Having named our new Project Folder, and designated a storage location, go ahead and check the Initialize Git Repository option. This will indicate to version control to monitor content and changes to files within this folder. + +![](images/3.png) + +
+ +--- + +The next setup screen will verify which version of R you wish to use. Since we are just getting started, your most recent version of R (usually system) should work. We will also leave the "renv" (reproducible environment setup) option unchecked for the time being (we will revisit the concept later in the course). + +![](images/4.png) + +
+ +--- + +And if all goes well, we should see the "New Folder Created" popup. + +![](images/5.png) + +
+ +--- + +## Creating SubFolders + +Once your new project folder has opened, you should be seeing the main layout elements that we briefly covered in the [Positron](/course/00_Positron/index.qmd) walk-through. + +For this section, we will primarily be focused on what is happening within the primary side bar on the left, where changes to the individual files within the folder since the last save/commit will be reflected by colored text. + +For my own projects, there are some elements of organization that I go ahead and add for each new folder. These include both a data and an images subfolders to help keep things a little more organized. + +To create these folders, we would click on the respective add folder (+) button on the side bar. Files and Folders can be clicked and dragged within the primary side bar to move things to new folder locations. + +![](images/6.png) + +
+ +--- + +## Creating Files + +In context of this course, we will primarily be working with two types of files when coding: + +- R Scripts: These files end in .R. These contain only code (with occasional \# comment line). These are often used for self-contained code that once we get them working we rarely need to modify. + +- Quarto Markdowns: These files end in .qmd. They contain a .yaml header, followed by a mix of regular written text (often explanations or other documentation), and sections (ie. chunks) that contain code. These are used when we are still getting the code to work, when we need to modify inputs frequently, or simply when we need to document what and why we are doing something to make life easier for our future-self two months from now. + +
+ +--- + +In this example, I will go ahead and select the new file icon + +![](images/7.png) + +
+ +--- + +Thenn I will name the file, and designate it as a Quarto Markdown file by adding the .qmd at the end of the name to denote the file type. + +![](images/8.png) + +
+ +--- + +## QMD Files + +Once this is done, we can now see we have a new .qmd file ("Example.qmd" in this case). + +### YAML + +As previously mentioned, the start of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file containg a [YAML](https://quarto.org/docs/authoring/front-matter.html) code chunk that is used to set formatting choices (we will explore this in-depth during the [next section](/course/00_Quarto/index.qmd)) + + +What designates the location of the YAML block are three hyphens at the start, and three hyphens at the end. For this example, we will also provide a "title:" and "format:" field for the time being (see additional options [here](https://quarto.org/docs/authoring/front-matter.html)). + +![](images/9.png) + +
+ +--- + +### Text + +With a basic YAML formatting block now in place, we can build out other elements of our Quarto Markdown document. Unless otherwise specified, everything else in the document is assumed to be text, so I will go ahead and provide an initial text description of what I am trying to do. + +![](images/10.png) + +
+ +--- + +### Code-Chunks + +Having provided some initial text for documentation, we can then add code-block chunks to start writing some code. + +The easiest way to do do this is to click the respective option on the upper-right of the Editor screen. Since Positron can handle multiple programming languages, so the chunk is inserted, we will need to select the language we use to be used within the code chunk (R in this case). + +![](images/11.png) + +
+ +--- + +You will notice, that the inserted code block starts off with three backticks (\`) and then "{r}". The end of the code block is denoted by an additional three backticks. + +We can also add new code blocks by simply typing these elements into the location we want to place a code chunk (as long as we are careful to add 3 backticks also at the end). + +![](images/12.png) + +
+ +--- + +![](images/13.png) + +
+ +--- + +### Running Code + +Now that we have two code-chunks written, we can write lines of code within them. For this example, I will use two beginner friendly functions, print("Hello"), which will print the contents contained between the " " to the console, and getwd() which will return the location of the folder you are working within (ie. the working directory). + +To run/execute these lines of code, we have a couple options. We can click on the Run Cell option that appears on the upper-left side of the code chunk. Additionally, it has a companion option that will run all code chunks above it. + +![](images/14.png) + +
+ +--- + +When a code block is successfully run, you will see within the console (lower bottom of the screen) the line of code be run, with any returned outputs appear directly after. + +![](images/15.png) + +
+ +--- + +An alternative to clicking the Run Cell button is to click on the line of code you are interested in running, then press (Ctrl + Enter)/(Command + Enter). This will execute the line of code that you have clicked on. This can be useful in scenarios where you want to run a specific line, and not the entire code-chunk. + +![](images/16.png) + +
+ +--- + +Using this approach, you can see the location (ie. file path) of the current working directory was returned to the Console. + +![](images/17.png) + +
+ +--- + +## Local Version Control + +Having introduced the main elements of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file, let's turn our attention to the tab within the editor showing our newly created .qmd file. + +We can see there is a solid circle next to the file name, and it is appearing as green. The circle denotes unsaved changes, which we can correct by clicking on the Save Button to save the changes to our file. + +![](images/18.png) + +
+ +--- + +### Untracked + +If we turn our attention to the left primary sidebar, we can see that within our GitPractie folder there are three files, our Example.qmd, and the default README.md and .gitignore files. These all show up in green text with U's to the right of the file names. + +This denotes that the version control tracking software Git is currently considering them as "Untracked" files. While saving the document via the Save button means we will still have our changes when we reopen Positron, we won't have any history of changes that we can use to revert back to the way all the files appeared at this exact point in time should something go wrong. + +We will next go the address bar on the very far left, and select the Git tab. + +![](images/19.png) + +
+ +--- + +On the Git tab, we can see that each of the three files are shown underneath a "Changes" drop-down. This contains the files that have undergone changes since the last commit. In our case, since we haven't updated the save-state yet, this last commit would be the initial creation of the project folder. + +![](images/20.png) + +
+ +--- + +To have version control track these individual files going forward, we can do so in two separate ways. We can add them individually by clicking the + symbol next to the individual names. + +![](images/21.png) + +
+ +--- + +### Staged + +This will result in the files being moved to the "Staged" dropdown. This denotes files being tracked with the intention of being recorded as the next save-state or waypoint (ie. a commit). + +![](images/22.png) + +
+ +--- + +### Commit + +To create a new commit (save-state or waypoint), once we have the files we want to track staged, we will write a commit message, and then press commit. + +A commit message is a brief description of the changes that have occurred to the files between this commit and the previous one. Make this short description informative enough that if you need to revert back in the future, you can quickly identify the commit you need to fall back to (more about this later). + +![](images/23.png) + +
+ +--- + +If this your first time using version control, you will likely encounter the following pop-up asking that you provide a user.name and user.email. This is used to designate the author of the changes.If you get this popup, go ahead and select "Open Git Log" + +![](images/24.png) + +
+ +--- + +### UserName and UserEmail + +The Output tab at the bottom of the screen will open, showing the messages that led to the popup. + +The important part to note is the commands that will be needed to provide your user name and email to the computer for authoring the commit. Typically, your email will be the same one you used for your GitHub account. + +![](images/25.png) + +
+ +--- + +From the displayed message, go ahead and copy + +"git config –global user.email "you\@example.com"" + +Then click on the adjacent terminal tab. You will paste the command in, but do not hit enter just yet. + +Windows users, please note, depending on your settings, if trying to paste from the keyboard into the terminal, you may need to press "Ctrl + Shift + V" instead of the usual "Ctrl + V". + +![](images/26.png) + +
+ +--- + +With the command now pasted (or typed), use your keyboard arrows to navigate to the email portion, and replace the generic email with your email address used for your GitHub account. + +Make sure that the quotation marks (") around the email address remain present, as they help the computer identify where your email address starts and ends. Once satisfied that your email address is correct, press enter. + +![](images/27.png) + +
+ +--- + +Next up, repeat the process, this time copying over the command needed to set your user name to the terminal. Repeat the editing process to provide your name between the "" marks. Then press enter. + +![](images/28.png) + +
+ +--- + +![](images/29.png) + +
+ +--- + +### First Commit + +Now that your user.name and email address have been provided, Git should be able to provide an author to the commit message. Reattempt to press commit button. + +If this is successful, you will see your initial commit appear on the bottom half of the left primary side bar, under the Graph dropdown. Congrats! Your files are now being tracked by version control. + +![](images/30.png) + +
+ +--- + +If you hover with your mouse arrow just over the commit, you can see the longer commit message and additional details appear. + +If you click on the commit tab, a new display will open in the editor, displaying the changes that occured in that commit compared to the previous one. In this case, since we added everything since the previous commit, nothing appears on the left side, while the entire documents contents appear highlighted in green on the right. + +Green highlighting is used to show additions, while red highlighting is used to show deletions. + +![](images/31.png) + +
+ +--- + +Having completed this initial commit, for this example, let's imitate a typical workflow and make some additional changes to the file before we make a second commit. Within text portions of the .qmd file, use of \# denotes a section header in markdown, so let's add a header for Introduction and click save. + +![](images/32.png) + +
+ +--- + +### Modified + +Within the left primary sidebar, we can see that the Git tracking has updated. Examples.qmd is visible once again. However, becuase it is now a tracked file, instead of showing up with the "U/Untracked" green highlight, it now appears as a brownish-red with a "M/Modified". + +Let's make an additional change to the .qmd file by adding another section (# Setup) and a code block with a commented out line (denoted by the \# at the line start), before pressing Save. + +![](images/33.png) + +
+ +--- + +If we were now to click on the Example.qmd file in the left primary sidebar, it will open the same kind of tracking display we saw previously. This time, we can see changes since our last commit. These appear as the green highlights along the scroll-bar, corresponding to the \# Introduction and \# Setup headers that we have added in since the last commit. + +![](images/34.png) + +
+ +--- + +For a larger document, we can scroll down to see the various highlighted regions. + +![](images/35.png) + +
+ +--- + +We could now repeat the steps showed above, staging the file, writing a commit message, and commiting again by clicking on the designated buttons. + +An important question is how often should we commit, vs. just hit save? Well... it depends :D +Let's think about this in context of a video game. If you made commits at regular intervals throughout the day (or more frequently when doing something particularly risky), you are more likely to be close enough to a particular commit (waypoint/save-state) that you can quickly revert back to without loosing any progress. Alternatively, if your last commit was last week, you will not have any intermediate versions to fall back to. + +### Commit via Terminal + +Having demonstrated how to commit changes to Git via the left primary side-bar, for this second commit, let's do it the alternate way via the terminal (tab on the panel at the bottom of your screen). + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +
+ +--- + +After clicking on the terminal tab, click on blinking command line. + +The command to stage a file is "git add ", followed by the name of the file you want to stage. + +In this case, you would enter "git add Example.qmd" and press Enter. +![](images/36.png) + +
+ +--- + +You will see after pressing enter a new blank terminal line appear. If you glance at the left-sidebar, you can see that Example.qmd now appears under the Staged Changes dropdown. + +![](images/37.png) + +
+ +--- + +Next up, let's write the git commit via the terminal. In this case, the command would be "git commit -m " (-m denoting message). The commit text is then surrounded by "" marks. + +For example: "git commit -m "Added section headers to my QMD file"" + +Press enter to save the commit. + +![](images/38.png) + +
+ +--- + +And you should see your second commit now appear in the left primary sidebar underneath the graphs dropdown. + +![](images/39.png) + +
+ +--- + +## Remote Version Control + +### Copying Project Folder to GitHub + +While having local version control in place is helpful when you need to revert back after encountering issues, where Git shines is the ability to pass your changes to your online GitHub repository. + +Not only does this allow you to switch between computers, but should something disastrous happen to your main computer, you still have all your hard work backed up and readily assessible. + +For this subsection, first, double check that Positron is still connected to your GitHub account by checking the user tab on the bottom-left. If not, repeat the [connection setup](/course/00_WorkstationSetup/Windows.qmd#connecting-github-and-positron). + +![](images/40.png) + +
+ +--- + +Since our project was created using the "New Folder from Template" option, it currently only exist locally. What we want to do next is to copy it to our GitHub account, creating a new repository in the process. + +To do this, we will first need to install the `usethis` R package. Within your console, you would run the following line of code: + +```{r} +#| eval: false +install.packages("usethis") +``` + +Depending on what R packages you already have installed on your computer, you may get a prompt asking if you want to update/install additional dependencies. Go ahead and type the number corresponding to Update All, and press enter. + +The package and all it's dependencies should then install. If an error message appears, read through it, and follow provided instructions. Go to [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) +if need help. + +
+ +---- + +Once the `usethis` package is installed, we need to activate it within R by calling it with the library command. This makes all the tools (ie. functions) within an R package available for use within Positron. + +In your console, you would type: + +```{r} +#| eval: FALSE +library(usethis) +``` + +![](images/46.png) + +
+ +--- + + +With library called, you now have access to the functions (tools) within the `usethis` R package. One of these is the `use_github()` function. + +In Positron, if you hover over a function, it will pull up the associated help file which will provide you information about the arguments the function expects to receive, and what they do. + +For `use_github()`, the main thing to remember for now is since this is a personal project being used for testing, we don't necessarily want to share it with the entire world, so we should set the "private" argument equal to TRUE when creating a new repository. + +![](images/46.png) + +
+ +--- + +Taking this information that we have now gathered, we can now within our Quarto Markdown create a code chunk, write out the line of code calling the function, and providing the Private=TRUE argument within the (). + +Within a code chunk, adding a \# in front of a line of code, will comment it out, resulting in that line of code not being run. Since we have already installed the `usethis` package, and we don't want to reinstall it every single time, let's go ahead and comment out that line. Go ahead and press Enter. + +![](images/47.png) + +
+ +--- + +We will see a message pop-up in the console. In this case, we had not saved before pressing enter, so there are uncommitted changes within the folder. The pop-up is asking whether you want to save these as well before sending the Folder to GitHub. + +In this case I will chose to ignore the uncommitted changes by entering 3 (for Definitely) in the console and hitting enter on my keyboard. + +![](images/48.png) + +
+ +--- + +The `usethis` R package will then execute the series of git commands that are needed to set up a GitHub repository (ie. the messages being displayed in the console window), and when finished will open a pop-up asking whether you want to see your new repository in your default Web Browser. I will go ahead and select yes in this case. + +![](images/49.png) + +
+ +--- + +After the browser opens, you can see that the elements I had staged and committed within Positron are now present within the GitHub repository. +Since I had only staged Example.qmd, it is the only file that was backed up. We can also see the commit history online by clicking on the commit clock. + + +![](images/50.png) + +
+ +--- + +As we would expect, we only see our two commit messages. One important thing to note is the commit hash numbers, that denote a particular commit. If we decided to revert/fall back to a prior commit in the future, this would be the number we would need to provide to Git to return to that previous commit/save-state + +![](images/51.png) + +
+ +--- + +Similarly, on GitHub, we have an option to Browse a Repository at a particular point in time. This will be quite useful later in the future when troubleshooting what major changes occurred between versions of an R package. + +![](images/52.png) + +
+ +--- + +### Code Chunk Arguments + +Having successfully connected our local Project Folder to a remote GitHub repository, let's return to Positron. + +Before continuing, if we left the code chunk that created the GitHub repository as is, every time we ran all code chunks in the document, it would try to recreate the GitHub repository. We don't want this to happen, as the setup was a one-time operation. + +While we could add \# in front of every line of code (or delete the code chunk entirely) it is often useful to have these set-up code chunks around to remind us what arguments we need to provide next time we need to a similar setup and are mind blanking on what to do. + +Fortunately, Quarto allows us to set conditions on whether a chunk is run (ie. evaluated). We will discuss the conditiona arguments in more depth in the [next section](/course/00_Quarto/index.qmd), but for now, we can modify the code chunk as follows. + + +On the next line after the {r}, we will add a hashtag (\#), then a pipe (|), followed by a space. This is the setup for a code-chunk specific argument. We will then add "eval: FALSE", which signals that the particular code-chunk should not be evaluated (ie, should not be run). + +![](images/53.png) + +
+ +--- + +### README + +Now that we have connected our local Project Folder to GitHub, and have gotten a basic introduction to the "git add", "git commit" arguments, let's turn our focus to the other files currently listed as untracked by Git within our folder, the README.md and the .gitignore files. + +When setting up our [GitHub]() account, we encounted an example of a README.md file. This file often provides a brief description of the project, and an outline of what the other files in the folder are for. As you may have gathered, even software developers are forgetful/under-caffenaited, and having notes to catch back up to speed is important. + +![](images/54.png) + +
+ +--- + + +### .gitignore +We additionally have a .gitignore file. Within a project, there are often some files that we will never want version control to track. These could be files that are too large for GitHub (ex. really large .fcs files), or files containing sensitive information (passwords, history, credentials, etc.). + +When the names of these file (or the file type shothand) are added to the .gitignore file, they are ignored by version control, and no longer appear on the primary left side bar. + +![](images/54.png) + +
+ +--- + +Let's proceed and stage both the README.md and .gitignore file, so that changes to these files will be tracked. We can of course select both from the primary left side bar and write a short commit message. + +![](images/55.png) + +
+ +--- + +![](images/56.png) + +
+ +--- + +Or alternatively, if we want to stage all uncommitted files present in a single step, we could in the terminal use the "git add ." + +We can then write our git commit using "git commit -m". + +Both approaches work, and you may switch between them based on preferrence. + +![](images/57.png) + +
+ +--- + +You will notice after having committed, that if you look at the Graph dropdown on the bottom half of the primary left side-bar that something has changed. + +There are now separate icons denoted as main and origin/main. These correspond to the last commit present locally (main), and the last commit on remote (ie. GitHub, origin/main). + +Local is ahead since you just made the commit with the changes inactivating the code-chunk, and you have not passed these changes up to GitHub yet. + +![](images/58.png) + +
+ +--- + + +### Pull + +Before sending (ie. pushing up) our updated commit to GitHub, especially if you are working on a project from multiple computers (or as part of a team) to bring in (ie. pull down) any changes that might be on GitHub that are not present locally. + +This ensures that everything is up to date, and you don't end up with mismatched commits that are incompatible with each other and trigger an error message. + +To pull in changes from GitHub, at the top of the primary left side-bar, you can select the ... button to open a drop-down menu of Git options. You would then select "Pull". + +Alternatively, you could do the same thing via the terminal by running the "git pull" command. + +![](images/59.png) + +
+ +--- + +### Push + +In our case, there was no new material present on our GitHub repository that were not already present locally, so all that is returned is the "Already up to date" message. + +We are now good to proceed to push (ie. send) the updated commit up to our GitHub repository. + +We can do this by either pressing the Sync changes button, or via the terminal entering the "git push" command. + +![](images/60.png) + +
+ +--- + +And now, if you glance down at left side-bar's graph section, you will see that both the main and origin/main icons are now present for the most recent commit. + +![](images/61.png) + +
+ +--- + +If we switch to our Web browser, we can see that this is also now the case for our GitHub repository that now also has the most recent changes. + +![](images/62.png) + +
+ +--- + +### Reverting to Prior Commit + +For most daily-workflows, you will only need the git commands that we have introduced above (git add, commit, pull, push). The next two areas (reverting to a prior commit, and branches) are more specialized, and will be covered in greater depth later in the course. We are briefly covering them here. If you are at the point where your last remaining neuron has disconnected, and you feel you need to take a break from version control, feel free to skip to the [next section](/course/00_Quarto/index.qmd) and we will revisit these topics later in the course. + +
+ +-- + +In most cases, if your code stops working, you can identify the issue and fix it in the existing version, never needing to resort to reverting to a previous commit (save-state). The times you would need to revert would be if you deleted important files, or the new files are hopeless mess that is not worth trying to sort through. In those cases, reverting back might be better approach. + +To imitate a falling back scenario, lets create and additional file, stage and commit it to end up a commit ahead of where we are currently at within the Project Folder. + +![](images/00_RevertTest.png) + + +
+ +--- + +Now being one (or several) commits ahead, if we wanted to revert back, we would first need to identify the commit we want to revert back to and copy the commit hash number. + +![](images/00_CommitHash.png) + + +
+ +--- + +Then, opening the terminal, we can enter "git reset " and paste the hash afterwards. We can then press enter. + + +![](images/00_GitReset.png) + + +
+ +--- + +You will notice our additional commit has been removed, although the newer files we were working on subsequent last commit are still present. + + +![](images/00_GitResetExecuted.png) + + +
+ +--- + +If however, we had wanted to return to the exact same state as the previous commit (removing all subsequent created files), we could do so by adding in the --hard argument. Before starting, save any newer files you want to keep in a completely different folder, because they will be permanently removed. + +Then, enter "git reset --hard thecommithashnumber" into the terminal, which would result in a "hard" return to the previous commits save-state. You may need to close and reopen Positron to see the changes reflected. + + +### Branches + +Branches are an useful Git feature that we will start using extensively later in the course. Branching allows you to create a parallel/carbon-copy of your existing repository, which you can then edit without affecting the main branch. This is particularly useful for projects that may get messy or drawn out. By isolating these edits to a parallel branch, if they don't work, your main branch remains safe. Alternatively, if you like the changes that occurred in the branch, you can pull these changes from the branch back to main, bringing the timelines back together. + +![](https://book.the-turing-way.org/build/sub-branch-491000deab04cb25ea703c007e2ebdd2.png) + +--- + +Within the terminal, entering "git branch" will show the existing branches. In this case, only main is present since we haven't yet created a new branch. + + +![](images/00_Branch.png) + +
+ +--- + +We can create a new branch in the terminal by entering "git branch " followed by the name of our desired branch. In this case, we are creating a branch called Week1 + +![](images/00_Week1.png) + +
+ +--- + +Now, when we check "git branch" again in the terminal, which returns the two branches, Week1 and main. The \* is located next to main, indicating that we are currently within the main branch. + +![](images/00_Branches.png) + +
+ +--- + +Besides the terminal, we can also create a new branch via Positron. To do so, we first click on the Git tab in the Actions Bar. + +Once the left-side bar displays the version control display, we can click on the ... button (to the right of changes)to gain access to the Git options drop-down. + +From here, we click on Branch, and then select Create Branch. + +![](images/00_BranchesGUI.png) + +
+ +--- + +Using Git branch, we saw that we were still within the main branch. In the terminal, we can switch over to the Week1 branch by using the "git checkout " command, followed by the branch we wish to switch to. + +![](images/00_Checkout.png) + +
+ +--- + +This results in us switching over to the Week1 branch. + +![](images/00_CheckoutOutput.png) + +
+ +--- + +Having switched (ie. checkout) to the Week 1 branch, let's create the file BranchTest.qmd, which will exist within this branch, but not yet in the main branch. + +![](images/00_BranchTest.png) + +
+ +--- + +Having created the file, let's stage and then commit it. This will put the Week1 branch ahead of the main branch by a single commit. + +![](images/BranchCommit.png) + +
+ +--- + +With our changes staged and committed, if we look at the left side-bar's graph section, our Week1 branch is now ahead of the origin/main branch by one commit. + +![](images/00_BranchToOrigin.png) + +
+ +--- + +If we were to check on GitHub, we can see that no new files are present on the main branch, but can see the notification listing recent changes to Week1 branch. + +![](images/00_GitHub.png) + +
+ +--- + +Using the drop-down, we can switch from displaying the main branch to the Week1 branch, where we can see the new file. + +![](images/00_GitHubWeek1.png) + +
+ +--- + +If we click the green compare and pull request button, we end up on this screen. This compares how the two branches are different from each other. + +![](images/00_GithubWeek1Merge.png) + +
+ +--- + +We will delve into branches again at a later point. For now, remember that by creating and prunning parallel branches, you can develop knowing that even if something goes wrong, your main branch remains safe. + + +# Wrap-Up + +In this section, we saw how to create a New Project Folder, create files and back up the project folder to GitHub. We also started learning about git, covering the basic commands (git add, commit, pull, push). If you feel a bit overwhelmed, please know, that is normal. Understanding how to leverage git takes time and practice, but is an incredibly valuable skillset to have in the long run. + +In the [next section](/course/00_Quarto/index.qmd), we will look at how by changing various elements within our .qmd file produce a variety of files, and how to leverage code-chunk arguments to fine-tune whether a code-chunk is utilized. + + +# Additional Resources + +[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) + +[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) + +[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Git/slides.qmd b/course/00_Git/slides.qmd index 247a262..6ddd2a5 100644 --- a/course/00_Git/slides.qmd +++ b/course/00_Git/slides.qmd @@ -1,1337 +1,1337 @@ ---- -title: "Version Control with Git" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -Now that we have created a [GitHub account](/course/00_GitHub/index.qmd), installed the required [software](/course/00_WorkstationSetup/index.qmd) and investigated [Positron's](/course/00_Positron/index.qmd) layout, we will start learning about version control software. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When working with code, it is important to stay organized. Ideally, everything needed for your code to successfully run should be present and accounted for within the local environment. Likewise, if you make changes, and your code stops working (no longer returning the expected output, ie. breaks), it would be most useful to have a track record of what has changed since your last working version in order to fix the issue. For beginners, this is often a typo in a function name or a misplaced comma somewhere within your document. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For this course, we will be using the version control software [Git](https://git-scm.com/). It is widely used by software developers and bioinformaticians worldwide, and is a very useful tool to have in your coding toolbox. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Git works locally within your individual project folders to track changes to the documents within, allowing to save the current state of the folder along the way (ie. a commit). This allows you to compare to previous versions (other commits) and return the changes that have occured to the tracked files. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As we saw during the [workstation setup](/course/00_WorkstationSetup/index.qmd) section, when you have a linked GitHub account, you can backup folders as repositories online. By leveraging the ability to send and receive changes, this allows you to modify a file on one computer, -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Individual repositories can be linked to a GitHub account, which permits them to be backed up online. Within our workflow, this allows to modify on one computer, back up (ie. push) the changes to GitHub, and then later on a different workstation, retrieve (ie. pull) these new changes and continue working. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this walk-through, we will set up a New Project Folder from a template, create a few folders and files, and work through how to use the main set of Git commands needed for this course. -::: -::: - ---- - -# Getting Started - -::: {.fragment} -::: {.callout-tip title="."} -For this walkthrough, we are going to create a brand new project folder. To do this, we can open the folder tab on the upper right. - -From here we can see we have two options, create a "New Folder from a Template", and create a "New Folder from Git" (which was the option we used during [workstation setup](/course/00_WorkstationSetup/index.qmd) to bring in the forked CytometryInR and README repository folders locally). - -We will go ahead and select "New Folder from a Template" for this example. -::: -::: - ---- - -![](images/1.png) - - ---- - -## New Folder from Template - -::: {.fragment} -::: {.callout-tip title="."} -Since Positron can use multiple programming languages, when we select "New Folder from Template" we will be asked what kind of folder template we want to use. Since we are working in R, we will select the "R Project" option. -::: -::: - ---- - -![](images/2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will next be asked to name the new project folder and a storage location. - -One thing I would like to remind everyone who is just starting to code is that it is best to avoid using [special characters](https://en.wikipedia.org/wiki/Regular_expression) (ex. @ $ # ^ ! ; : ,) in any folder or file name. This is because when coding, these can be misinterpreted as commands. - -While spaces are generally okay, it is often to best stick to to stick to hyphens (-), underscores (_). We will explore naming conventions in more depth at a later time. -::: -::: - -![](https://pbs.twimg.com/media/FxVpCpqaIAE_iqU?format=jpg&name=small) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Another useful thing to know when getting started with version control, it is best to save your files within your local computer, avoid using OneDrive or other cloud storage options for the time reason. The reason behind is that permissions to write/save to the cloud locations can sometimes be quite finicky, and some autosave/indexing behaviors can cause issues. akes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. - -Having named our new Project Folder, and designated a storage location, go ahead and check the Initialize Git Repository option. This will indicate to version control to monitor content and changes to files within this folder. -::: -::: ---- - -![](images/3.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The next setup screen will verify which version of R you wish to use. Since we are just getting started, your most recent version of R (usually system) should work. We will also leave the "renv" (reproducible environment setup) option unchecked for the time being (we will revisit the concept later in the course). -::: -::: - ---- - -![](images/4.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all goes well, we should see the "New Folder Created" popup. -::: -::: - ---- - -![](images/5.png) - - ---- - -## Creating SubFolders - -::: {.fragment} -::: {.callout-tip title="."} -Once your new project folder has opened, you should be seeing the main layout elements that we briefly covered in the [Positron](/course/00_Positron/index.qmd) walk-through. - -For this section, we will primarily be focused on what is happening within the primary side bar on the left, where changes to the individual files within the folder since the last save/commit will be reflected by colored text. - -For my own projects, there are some elements of organization that I go ahead and add for each new folder. These include both a data and an images subfolders to help keep things a little more organized. - -To create these folders, we would click on the respective add folder (+) button on the side bar. Files and Folders can be clicked and dragged within the primary side bar to move things to new folder locations. -::: -::: - ---- - -![](images/6.png) - - ---- - -## Creating Files - -::: {.fragment} -::: {.callout-tip title="."} -In context of this course, we will primarily be working with two types of files when coding: - -- R Scripts: These files end in .R. These contain only code (with occasional \# comment line). These are often used for self-contained code that once we get them working we rarely need to modify. - -- Quarto Markdowns: These files end in .qmd. They contain a .yaml header, followed by a mix of regular written text (often explanations or other documentation), and sections (ie. chunks) that contain code. These are used when we are still getting the code to work, when we need to modify inputs frequently, or simply when we need to document what and why we are doing something to make life easier for our future-self two months from now. -::: -::: - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this example, I will go ahead and select the new file icon -::: -::: - ---- - -![](images/7.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Thenn I will name the file, and designate it as a Quarto Markdown file by adding the .qmd at the end of the name to denote the file type. -::: -::: - ---- - -![](images/8.png) - - ---- - -## QMD Files - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, we can now see we have a new .qmd file ("Example.qmd" in this case). -::: -::: - -### YAML - -::: {.fragment} -::: {.callout-tip title="."} -As previously mentioned, the start of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file containg a [YAML](https://quarto.org/docs/authoring/front-matter.html) code chunk that is used to set formatting choices (we will explore this in-depth during the [next section](/course/00_Quarto/index.qmd)) - - -What designates the location of the YAML block are three hyphens at the start, and three hyphens at the end. For this example, we will also provide a "title:" and "format:" field for the time being (see additional options [here](https://quarto.org/docs/authoring/front-matter.html)). -::: -::: - ---- - -![](images/9.png) - - ---- - -### Text - -::: {.fragment} -::: {.callout-tip title="."} -With a basic YAML formatting block now in place, we can build out other elements of our Quarto Markdown document. Unless otherwise specified, everything else in the document is assumed to be text, so I will go ahead and provide an initial text description of what I am trying to do. -::: -::: - ---- - -![](images/10.png) - - ---- - -### Code-Chunks - -::: {.fragment} -::: {.callout-tip title="."} -Having provided some initial text for documentation, we can then add code-block chunks to start writing some code. - -The easiest way to do do this is to click the respective option on the upper-right of the Editor screen. Since Positron can handle multiple programming languages, so the chunk is inserted, we will need to select the language we use to be used within the code chunk (R in this case). -::: -::: - ---- - -![](images/11.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will notice, that the inserted code block starts off with three backticks (\`) and then "{r}". The end of the code block is denoted by an additional three backticks. - -We can also add new code blocks by simply typing these elements into the location we want to place a code chunk (as long as we are careful to add 3 backticks also at the end). -::: -::: - ---- - -![](images/12.png) - ---- - -![](images/13.png) - - ---- - -### Running Code - -::: {.fragment} -::: {.callout-tip title="."} -Now that we have two code-chunks written, we can write lines of code within them. For this example, I will use two beginner friendly functions, print("Hello"), which will print the contents contained between the " " to the console, and getwd() which will return the location of the folder you are working within (ie. the working directory). - -To run/execute these lines of code, we have a couple options. We can click on the Run Cell option that appears on the upper-left side of the code chunk. Additionally, it has a companion option that will run all code chunks above it. -::: -::: - ---- - -![](images/14.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When a code block is successfully run, you will see within the console (lower bottom of the screen) the line of code be run, with any returned outputs appear directly after. -::: -::: - ---- - -![](images/15.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -An alternative to clicking the Run Cell button is to click on the line of code you are interested in running, then press (Ctrl + Enter)/(Command + Enter). This will execute the line of code that you have clicked on. This can be useful in scenarios where you want to run a specific line, and not the entire code-chunk. -::: -::: - ---- - -![](images/16.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Using this approach, you can see the location (ie. file path) of the current working directory was returned to the Console. -::: -::: - ---- - -![](images/17.png) - - ---- - -## Local Version Control - -::: {.fragment} -::: {.callout-tip title="."} -Having introduced the main elements of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file, let's turn our attention to the tab within the editor showing our newly created .qmd file. - -We can see there is a solid circle next to the file name, and it is appearing as green. The circle denotes unsaved changes, which we can correct by clicking on the Save Button to save the changes to our file. -::: -::: - ---- - -![](images/18.png) - - ---- - -### Untracked - -::: {.fragment} -::: {.callout-tip title="."} -If we turn our attention to the left primary sidebar, we can see that within our GitPractie folder there are three files, our Example.qmd, and the default README.md and .gitignore files. These all show up in green text with U's to the right of the file names. - -This denotes that the version control tracking software Git is currently considering them as "Untracked" files. While saving the document via the Save button means we will still have our changes when we reopen Positron, we won't have any history of changes that we can use to revert back to the way all the files appeared at this exact point in time should something go wrong. - -We will next go the address bar on the very far left, and select the Git tab. -::: -::: - ---- - -![](images/19.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the Git tab, we can see that each of the three files are shown underneath a "Changes" drop-down. This contains the files that have undergone changes since the last commit. In our case, since we haven't updated the save-state yet, this last commit would be the initial creation of the project folder. -::: -::: - ---- - -![](images/20.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To have version control track these individual files going forward, we can do so in two separate ways. We can add them individually by clicking the + symbol next to the individual names. -::: -::: - ---- - -![](images/21.png) - - ---- - -### Staged - -::: {.fragment} -::: {.callout-tip title="."} -This will result in the files being moved to the "Staged" dropdown. This denotes files being tracked with the intention of being recorded as the next save-state or waypoint (ie. a commit). -::: -::: - ---- - -![](images/22.png) - - ---- - -### Commit - -::: {.fragment} -::: {.callout-tip title="."} -To create a new commit (save-state or waypoint), once we have the files we want to track staged, we will write a commit message, and then press commit. - -A commit message is a brief description of the changes that have occurred to the files between this commit and the previous one. Make this short description informative enough that if you need to revert back in the future, you can quickly identify the commit you need to fall back to (more about this later). -::: -::: - ---- - -![](images/23.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If this your first time using version control, you will likely encounter the following pop-up asking that you provide a user.name and user.email. This is used to designate the author of the changes.If you get this popup, go ahead and select "Open Git Log" -::: -::: - ---- - -![](images/24.png) - - ---- - -### UserName and UserEmail - -::: {.fragment} -::: {.callout-tip title="."} -The Output tab at the bottom of the screen will open, showing the messages that led to the popup. - -The important part to note is the commands that will be needed to provide your user name and email to the computer for authoring the commit. Typically, your email will be the same one you used for your GitHub account. -::: -::: - ---- - -![](images/25.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From the displayed message, go ahead and copy - -"git config –global user.email "you\@example.com"" - -Then click on the adjacent terminal tab. You will paste the command in, but do not hit enter just yet. - -Windows users, please note, depending on your settings, if trying to paste from the keyboard into the terminal, you may need to press "Ctrl + Shift + V" instead of the usual "Ctrl + V". -::: -::: - ---- - -![](images/26.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With the command now pasted (or typed), use your keyboard arrows to navigate to the email portion, and replace the generic email with your email address used for your GitHub account. - -Make sure that the quotation marks (") around the email address remain present, as they help the computer identify where your email address starts and ends. Once satisfied that your email address is correct, press enter. -::: -::: - ---- - -![](images/27.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next up, repeat the process, this time copying over the command needed to set your user name to the terminal. Repeat the editing process to provide your name between the "" marks. Then press enter. -::: -::: - ---- - -![](images/28.png) - ---- - -![](images/29.png) - - ---- - -### First Commit - -::: {.fragment} -::: {.callout-tip title="."} -Now that your user.name and email address have been provided, Git should be able to provide an author to the commit message. Reattempt to press commit button. - -If this is successful, you will see your initial commit appear on the bottom half of the left primary side bar, under the Graph dropdown. Congrats! Your files are now being tracked by version control. -::: -::: - ---- - -![](images/30.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you hover with your mouse arrow just over the commit, you can see the longer commit message and additional details appear. - -If you click on the commit tab, a new display will open in the editor, displaying the changes that occured in that commit compared to the previous one. In this case, since we added everything since the previous commit, nothing appears on the left side, while the entire documents contents appear highlighted in green on the right. - -Green highlighting is used to show additions, while red highlighting is used to show deletions. -::: -::: - ---- - -![](images/31.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having completed this initial commit, for this example, let's imitate a typical workflow and make some additional changes to the file before we make a second commit. Within text portions of the .qmd file, use of \# denotes a section header in markdown, so let's add a header for Introduction and click save. -::: -::: - ---- - -![](images/32.png) - - ---- - -### Modified - -::: {.fragment} -::: {.callout-tip title="."} -Within the left primary sidebar, we can see that the Git tracking has updated. Examples.qmd is visible once again. However, becuase it is now a tracked file, instead of showing up with the "U/Untracked" green highlight, it now appears as a brownish-red with a "M/Modified". - -Let's make an additional change to the .qmd file by adding another section (# Setup) and a code block with a commented out line (denoted by the \# at the line start), before pressing Save. -::: -::: - ---- - -![](images/33.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we were now to click on the Example.qmd file in the left primary sidebar, it will open the same kind of tracking display we saw previously. This time, we can see changes since our last commit. These appear as the green highlights along the scroll-bar, corresponding to the \# Introduction and \# Setup headers that we have added in since the last commit. -::: -::: - ---- - -![](images/34.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For a larger document, we can scroll down to see the various highlighted regions. -::: -::: - ---- - -![](images/35.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We could now repeat the steps showed above, staging the file, writing a commit message, and commiting again by clicking on the designated buttons. - -An important question is how often should we commit, vs. just hit save? Well... it depends :D -Let's think about this in context of a video game. If you made commits at regular intervals throughout the day (or more frequently when doing something particularly risky), you are more likely to be close enough to a particular commit (waypoint/save-state) that you can quickly revert back to without loosing any progress. Alternatively, if your last commit was last week, you will not have any intermediate versions to fall back to. -::: -::: - -### Commit via Terminal - -::: {.fragment} -::: {.callout-tip title="."} -Having demonstrated how to commit changes to Git via the left primary side-bar, for this second commit, let's do it the alternate way via the terminal (tab on the panel at the bottom of your screen). -::: -::: - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After clicking on the terminal tab, click on blinking command line. - -The command to stage a file is "git add ", followed by the name of the file you want to stage. - -In this case, you would enter "git add Example.qmd" and press Enter. -::: -::: - ---- - -![](images/36.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will see after pressing enter a new blank terminal line appear. If you glance at the left-sidebar, you can see that Example.qmd now appears under the Staged Changes dropdown. -::: -::: - ---- - -![](images/37.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next up, let's write the git commit via the terminal. In this case, the command would be "git commit -m " (-m denoting message). The commit text is then surrounded by "" marks. - -For example: "git commit -m "Added section headers to my QMD file"" - -Press enter to save the commit. -::: -::: - ---- - -![](images/38.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And you should see your second commit now appear in the left primary sidebar underneath the graphs dropdown. -::: -::: - ---- - -![](images/39.png) - - ---- - -## Remote Version Control - -### Copying Project Folder to GitHub - -::: {.fragment} -::: {.callout-tip title="."} -While having local version control in place is helpful when you need to revert back after encountering issues, where Git shines is the ability to pass your changes to your online GitHub repository. - -Not only does this allow you to switch between computers, but should something disastrous happen to your main computer, you still have all your hard work backed up and readily assessible. - -For this subsection, first, double check that Positron is still connected to your GitHub account by checking the user tab on the bottom-left. If not, repeat the [connection setup](/course/00_WorkstationSetup/Windows.qmd#connecting-github-and-positron). -::: -::: - ---- - -![](images/40.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Since our project was created using the "New Folder from Template" option, it currently only exist locally. What we want to do next is to copy it to our GitHub account, creating a new repository in the process. - -To do this, we will first need to install the `usethis` R package. Within your console, you would run the following line of code: -::: -::: - -```{r} -#| eval: false -install.packages("usethis") -``` - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Depending on what R packages you already have installed on your computer, you may get a prompt asking if you want to update/install additional dependencies. Go ahead and type the number corresponding to Update All, and press enter. - -The package and all it's dependencies should then install. If an error message appears, read through it, and follow provided instructions. Go to [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) -if need help. -::: -::: - - ----- - -::: {.fragment} -::: {.callout-tip title="."} -Once the `usethis` package is installed, we need to activate it within R by calling it with the library command. This makes all the tools (ie. functions) within an R package available for use within Positron. - -In your console, you would type: -::: -::: - -```{r} -#| eval: FALSE -library(usethis) -``` - ---- - -![](images/46.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With library called, you now have access to the functions (tools) within the `usethis` R package. One of these is the `use_github()` function. - -In Positron, if you hover over a function, it will pull up the associated help file which will provide you information about the arguments the function expects to receive, and what they do. - -For `use_github()`, the main thing to remember for now is since this is a personal project being used for testing, we don't necessarily want to share it with the entire world, so we should set the "private" argument equal to TRUE when creating a new repository. -::: -::: - ---- - -![](images/46.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Taking this information that we have now gathered, we can now within our Quarto Markdown create a code chunk, write out the line of code calling the function, and providing the Private=TRUE argument within the (). - -Within a code chunk, adding a \# in front of a line of code, will comment it out, resulting in that line of code not being run. Since we have already installed the `usethis` package, and we don't want to reinstall it every single time, let's go ahead and comment out that line. Go ahead and press Enter. -::: -::: - ---- - -![](images/47.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will see a message pop-up in the console. In this case, we had not saved before pressing enter, so there are uncommitted changes within the folder. The pop-up is asking whether you want to save these as well before sending the Folder to GitHub. - -In this case I will chose to ignore the uncommitted changes by entering 3 (for Definitely) in the console and hitting enter on my keyboard. -::: -::: - ---- - -![](images/48.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The `usethis` R package will then execute the series of git commands that are needed to set up a GitHub repository (ie. the messages being displayed in the console window), and when finished will open a pop-up asking whether you want to see your new repository in your default Web Browser. I will go ahead and select yes in this case. -::: -::: - ---- - -![](images/49.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After the browser opens, you can see that the elements I had staged and committed within Positron are now present within the GitHub repository. -Since I had only staged Example.qmd, it is the only file that was backed up. We can also see the commit history online by clicking on the commit clock. -::: -::: - ---- - -![](images/50.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As we would expect, we only see our two commit messages. One important thing to note is the commit hash numbers, that denote a particular commit. If we decided to revert/fall back to a prior commit in the future, this would be the number we would need to provide to Git to return to that previous commit/save-state -::: -::: - ---- - -![](images/51.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similarly, on GitHub, we have an option to Browse a Repository at a particular point in time. This will be quite useful later in the future when troubleshooting what major changes occurred between versions of an R package. -::: -::: - ---- - -![](images/52.png) - - ---- - -### Code Chunk Arguments - -::: {.fragment} -::: {.callout-tip title="."} -Having successfully connected our local Project Folder to a remote GitHub repository, let's return to Positron. - -Before continuing, if we left the code chunk that created the GitHub repository as is, every time we ran all code chunks in the document, it would try to recreate the GitHub repository. We don't want this to happen, as the setup was a one-time operation. - -While we could add \# in front of every line of code (or delete the code chunk entirely) it is often useful to have these set-up code chunks around to remind us what arguments we need to provide next time we need to a similar setup and are mind blanking on what to do. - -Fortunately, Quarto allows us to set conditions on whether a chunk is run (ie. evaluated). We will discuss the conditiona arguments in more depth in the [next section](/course/00_Quarto/index.qmd), but for now, we can modify the code chunk as follows. - - -On the next line after the {r}, we will add a hashtag (\#), then a pipe (|), followed by a space. This is the setup for a code-chunk specific argument. We will then add "eval: FALSE", which signals that the particular code-chunk should not be evaluated (ie, should not be run). -::: -::: - ---- - -![](images/53.png) - - ---- - -### README - -::: {.fragment} -::: {.callout-tip title="."} -Now that we have connected our local Project Folder to GitHub, and have gotten a basic introduction to the "git add", "git commit" arguments, let's turn our focus to the other files currently listed as untracked by Git within our folder, the README.md and the .gitignore files. - -When setting up our [GitHub]() account, we encounted an example of a README.md file. This file often provides a brief description of the project, and an outline of what the other files in the folder are for. As you may have gathered, even software developers are forgetful/under-caffenaited, and having notes to catch back up to speed is important. -::: -::: - ---- - -![](images/54.png) - - ---- - - -### .gitignore - -::: {.fragment} -::: {.callout-tip title="."} -We additionally have a .gitignore file. Within a project, there are often some files that we will never want version control to track. These could be files that are too large for GitHub (ex. really large .fcs files), or files containing sensitive information (passwords, history, credentials, etc.). - -When the names of these file (or the file type shothand) are added to the .gitignore file, they are ignored by version control, and no longer appear on the primary left side bar. -::: -::: - ---- - -![](images/54.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Let's proceed and stage both the README.md and .gitignore file, so that changes to these files will be tracked. We can of course select both from the primary left side bar and write a short commit message. -::: -::: - ---- - -![](images/55.png) - ---- - -![](images/56.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Or alternatively, if we want to stage all uncommitted files present in a single step, we could in the terminal use the "git add ." - -We can then write our git commit using "git commit -m". - -Both approaches work, and you may switch between them based on preferrence. -::: -::: - ---- - -![](images/57.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will notice after having committed, that if you look at the Graph dropdown on the bottom half of the primary left side-bar that something has changed. - -There are now separate icons denoted as main and origin/main. These correspond to the last commit present locally (main), and the last commit on remote (ie. GitHub, origin/main). - -Local is ahead since you just made the commit with the changes inactivating the code-chunk, and you have not passed these changes up to GitHub yet. -::: -::: - ---- - -![](images/58.png) - - ---- - - -### Pull - -::: {.fragment} -::: {.callout-tip title="."} -Before sending (ie. pushing up) our updated commit to GitHub, especially if you are working on a project from multiple computers (or as part of a team) to bring in (ie. pull down) any changes that might be on GitHub that are not present locally. - -This ensures that everything is up to date, and you don't end up with mismatched commits that are incompatible with each other and trigger an error message. - -To pull in changes from GitHub, at the top of the primary left side-bar, you can select the ... button to open a drop-down menu of Git options. You would then select "Pull". - -Alternatively, you could do the same thing via the terminal by running the "git pull" command. -::: -::: - ---- - -![](images/59.png) - - ---- - -### Push - -::: {.fragment} -::: {.callout-tip title="."} -In our case, there was no new material present on our GitHub repository that were not already present locally, so all that is returned is the "Already up to date" message. - -We are now good to proceed to push (ie. send) the updated commit up to our GitHub repository. - -We can do this by either pressing the Sync changes button, or via the terminal entering the "git push" command. -::: -::: - ---- - -![](images/60.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And now, if you glance down at left side-bar's graph section, you will see that both the main and origin/main icons are now present for the most recent commit. -::: -::: - ---- - -![](images/61.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we switch to our Web browser, we can see that this is also now the case for our GitHub repository that now also has the most recent changes. -::: -::: - ---- - -![](images/62.png) - - ---- - -### Reverting to Prior Commit - -::: {.fragment} -::: {.callout-tip title="."} -For most daily-workflows, you will only need the git commands that we have introduced above (git add, commit, pull, push). The next two areas (reverting to a prior commit, and branches) are more specialized, and will be covered in greater depth later in the course. We are briefly covering them here. If you are at the point where your last remaining neuron has disconnected, and you feel you need to take a break from version control, feel free to skip to the [next section](/course/00_Quarto/index.qmd) and we will revisit these topics later in the course. -::: -::: - - --- - -::: {.fragment} -::: {.callout-tip title="."} -In most cases, if your code stops working, you can identify the issue and fix it in the existing version, never needing to resort to reverting to a previous commit (save-state). The times you would need to revert would be if you deleted important files, or the new files are hopeless mess that is not worth trying to sort through. In those cases, reverting back might be better approach. - -To imitate a falling back scenario, lets create and additional file, stage and commit it to end up a commit ahead of where we are currently at within the Project Folder. -::: -::: - ---- - -![](images/00_RevertTest.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Now being one (or several) commits ahead, if we wanted to revert back, we would first need to identify the commit we want to revert back to and copy the commit hash number. -::: -::: - ---- - -![](images/00_CommitHash.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Then, opening the terminal, we can enter "git reset " and paste the hash afterwards. We can then press enter. -::: -::: - ---- - -![](images/00_GitReset.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will notice our additional commit has been removed, although the newer files we were working on subsequent last commit are still present. -::: -::: - ---- - -![](images/00_GitResetExecuted.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If however, we had wanted to return to the exact same state as the previous commit (removing all subsequent created files), we could do so by adding in the --hard argument. Before starting, save any newer files you want to keep in a completely different folder, because they will be permanently removed. - -Then, enter "git reset --hard thecommithashnumber" into the terminal, which would result in a "hard" return to the previous commits save-state. You may need to close and reopen Positron to see the changes reflected. -::: -::: - ---- - -### Branches - -::: {.fragment} -::: {.callout-tip title="."} -Branches are an useful Git feature that we will start using extensively later in the course. Branching allows you to create a parallel/carbon-copy of your existing repository, which you can then edit without affecting the main branch. This is particularly useful for projects that may get messy or drawn out. By isolating these edits to a parallel branch, if they don't work, your main branch remains safe. Alternatively, if you like the changes that occurred in the branch, you can pull these changes from the branch back to main, bringing the timelines back together. -::: -::: - -![](https://book.the-turing-way.org/build/sub-branch-491000deab04cb25ea703c007e2ebdd2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Within the terminal, entering "git branch" will show the existing branches. In this case, only main is present since we haven't yet created a new branch. -::: -::: - ---- - -![](images/00_Branch.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can create a new branch in the terminal by entering "git branch " followed by the name of our desired branch. In this case, we are creating a branch called Week1 -::: -::: - ---- - -![](images/00_Week1.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Now, when we check "git branch" again in the terminal, which returns the two branches, Week1 and main. The \* is located next to main, indicating that we are currently within the main branch. -::: -::: - ---- - -![](images/00_Branches.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Besides the terminal, we can also create a new branch via Positron. To do so, we first click on the Git tab in the Actions Bar. - -Once the left-side bar displays the version control display, we can click on the ... button (to the right of changes)to gain access to the Git options drop-down. - -From here, we click on Branch, and then select Create Branch. -::: -::: - ---- - -![](images/00_BranchesGUI.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Using Git branch, we saw that we were still within the main branch. In the terminal, we can switch over to the Week1 branch by using the "git checkout " command, followed by the branch we wish to switch to. -::: -::: - ---- - -![](images/00_Checkout.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This results in us switching over to the Week1 branch. -::: -::: - ---- - -![](images/00_CheckoutOutput.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having switched (ie. checkout) to the Week 1 branch, let's create the file BranchTest.qmd, which will exist within this branch, but not yet in the main branch. -::: -::: - ---- - -![](images/00_BranchTest.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having created the file, let's stage and then commit it. This will put the Week1 branch ahead of the main branch by a single commit. -::: -::: - ---- - -![](images/BranchCommit.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With our changes staged and committed, if we look at the left side-bar's graph section, our Week1 branch is now ahead of the origin/main branch by one commit. -::: -::: - ---- - -![](images/00_BranchToOrigin.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we were to check on GitHub, we can see that no new files are present on the main branch, but can see the notification listing recent changes to Week1 branch. -::: -::: - ---- - -![](images/00_GitHub.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Using the drop-down, we can switch from displaying the main branch to the Week1 branch, where we can see the new file. -::: -::: - ---- - -![](images/00_GitHubWeek1.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we click the green compare and pull request button, we end up on this screen. This compares how the two branches are different from each other. -::: -::: - ---- - -![](images/00_GithubWeek1Merge.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will delve into branches again at a later point. For now, remember that by creating and prunning parallel branches, you can develop knowing that even if something goes wrong, your main branch remains safe. -::: -::: - ---- - -# Wrap-Up - -::: {.fragment} -::: {.callout-tip title="."} -In this section, we saw how to create a New Project Folder, create files and back up the project folder to GitHub. We also started learning about git, covering the basic commands (git add, commit, pull, push). If you feel a bit overwhelmed, please know, that is normal. Understanding how to leverage git takes time and practice, but is an incredibly valuable skillset to have in the long run. - -In the [next section](/course/00_Quarto/index.qmd), we will look at how by changing various elements within our .qmd file produce a variety of files, and how to leverage code-chunk arguments to fine-tune whether a code-chunk is utilized. -::: -::: - -# Additional Resources - -[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) - -[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) - -[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Version Control with Git" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have created a [GitHub account](/course/00_GitHub/index.qmd), installed the required [software](/course/00_WorkstationSetup/index.qmd) and investigated [Positron's](/course/00_Positron/index.qmd) layout, we will start learning about version control software. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When working with code, it is important to stay organized. Ideally, everything needed for your code to successfully run should be present and accounted for within the local environment. Likewise, if you make changes, and your code stops working (no longer returning the expected output, ie. breaks), it would be most useful to have a track record of what has changed since your last working version in order to fix the issue. For beginners, this is often a typo in a function name or a misplaced comma somewhere within your document. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For this course, we will be using the version control software [Git](https://git-scm.com/). It is widely used by software developers and bioinformaticians worldwide, and is a very useful tool to have in your coding toolbox. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Git works locally within your individual project folders to track changes to the documents within, allowing to save the current state of the folder along the way (ie. a commit). This allows you to compare to previous versions (other commits) and return the changes that have occured to the tracked files. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we saw during the [workstation setup](/course/00_WorkstationSetup/index.qmd) section, when you have a linked GitHub account, you can backup folders as repositories online. By leveraging the ability to send and receive changes, this allows you to modify a file on one computer, +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Individual repositories can be linked to a GitHub account, which permits them to be backed up online. Within our workflow, this allows to modify on one computer, back up (ie. push) the changes to GitHub, and then later on a different workstation, retrieve (ie. pull) these new changes and continue working. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this walk-through, we will set up a New Project Folder from a template, create a few folders and files, and work through how to use the main set of Git commands needed for this course. +::: +::: + +--- + +# Getting Started + +::: {.fragment} +::: {.callout-tip title="."} +For this walkthrough, we are going to create a brand new project folder. To do this, we can open the folder tab on the upper right. + +From here we can see we have two options, create a "New Folder from a Template", and create a "New Folder from Git" (which was the option we used during [workstation setup](/course/00_WorkstationSetup/index.qmd) to bring in the forked CytometryInR and README repository folders locally). + +We will go ahead and select "New Folder from a Template" for this example. +::: +::: + +--- + +![](images/1.png) + + +--- + +## New Folder from Template + +::: {.fragment} +::: {.callout-tip title="."} +Since Positron can use multiple programming languages, when we select "New Folder from Template" we will be asked what kind of folder template we want to use. Since we are working in R, we will select the "R Project" option. +::: +::: + +--- + +![](images/2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will next be asked to name the new project folder and a storage location. + +One thing I would like to remind everyone who is just starting to code is that it is best to avoid using [special characters](https://en.wikipedia.org/wiki/Regular_expression) (ex. @ $ # ^ ! ; : ,) in any folder or file name. This is because when coding, these can be misinterpreted as commands. + +While spaces are generally okay, it is often to best stick to to stick to hyphens (-), underscores (_). We will explore naming conventions in more depth at a later time. +::: +::: + +![](https://pbs.twimg.com/media/FxVpCpqaIAE_iqU?format=jpg&name=small) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Another useful thing to know when getting started with version control, it is best to save your files within your local computer, avoid using OneDrive or other cloud storage options for the time reason. The reason behind is that permissions to write/save to the cloud locations can sometimes be quite finicky, and some autosave/indexing behaviors can cause issues. akes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. + +Having named our new Project Folder, and designated a storage location, go ahead and check the Initialize Git Repository option. This will indicate to version control to monitor content and changes to files within this folder. +::: +::: +--- + +![](images/3.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The next setup screen will verify which version of R you wish to use. Since we are just getting started, your most recent version of R (usually system) should work. We will also leave the "renv" (reproducible environment setup) option unchecked for the time being (we will revisit the concept later in the course). +::: +::: + +--- + +![](images/4.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all goes well, we should see the "New Folder Created" popup. +::: +::: + +--- + +![](images/5.png) + + +--- + +## Creating SubFolders + +::: {.fragment} +::: {.callout-tip title="."} +Once your new project folder has opened, you should be seeing the main layout elements that we briefly covered in the [Positron](/course/00_Positron/index.qmd) walk-through. + +For this section, we will primarily be focused on what is happening within the primary side bar on the left, where changes to the individual files within the folder since the last save/commit will be reflected by colored text. + +For my own projects, there are some elements of organization that I go ahead and add for each new folder. These include both a data and an images subfolders to help keep things a little more organized. + +To create these folders, we would click on the respective add folder (+) button on the side bar. Files and Folders can be clicked and dragged within the primary side bar to move things to new folder locations. +::: +::: + +--- + +![](images/6.png) + + +--- + +## Creating Files + +::: {.fragment} +::: {.callout-tip title="."} +In context of this course, we will primarily be working with two types of files when coding: + +- R Scripts: These files end in .R. These contain only code (with occasional \# comment line). These are often used for self-contained code that once we get them working we rarely need to modify. + +- Quarto Markdowns: These files end in .qmd. They contain a .yaml header, followed by a mix of regular written text (often explanations or other documentation), and sections (ie. chunks) that contain code. These are used when we are still getting the code to work, when we need to modify inputs frequently, or simply when we need to document what and why we are doing something to make life easier for our future-self two months from now. +::: +::: + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this example, I will go ahead and select the new file icon +::: +::: + +--- + +![](images/7.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Thenn I will name the file, and designate it as a Quarto Markdown file by adding the .qmd at the end of the name to denote the file type. +::: +::: + +--- + +![](images/8.png) + + +--- + +## QMD Files + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, we can now see we have a new .qmd file ("Example.qmd" in this case). +::: +::: + +### YAML + +::: {.fragment} +::: {.callout-tip title="."} +As previously mentioned, the start of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file containg a [YAML](https://quarto.org/docs/authoring/front-matter.html) code chunk that is used to set formatting choices (we will explore this in-depth during the [next section](/course/00_Quarto/index.qmd)) + + +What designates the location of the YAML block are three hyphens at the start, and three hyphens at the end. For this example, we will also provide a "title:" and "format:" field for the time being (see additional options [here](https://quarto.org/docs/authoring/front-matter.html)). +::: +::: + +--- + +![](images/9.png) + + +--- + +### Text + +::: {.fragment} +::: {.callout-tip title="."} +With a basic YAML formatting block now in place, we can build out other elements of our Quarto Markdown document. Unless otherwise specified, everything else in the document is assumed to be text, so I will go ahead and provide an initial text description of what I am trying to do. +::: +::: + +--- + +![](images/10.png) + + +--- + +### Code-Chunks + +::: {.fragment} +::: {.callout-tip title="."} +Having provided some initial text for documentation, we can then add code-block chunks to start writing some code. + +The easiest way to do do this is to click the respective option on the upper-right of the Editor screen. Since Positron can handle multiple programming languages, so the chunk is inserted, we will need to select the language we use to be used within the code chunk (R in this case). +::: +::: + +--- + +![](images/11.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice, that the inserted code block starts off with three backticks (\`) and then "{r}". The end of the code block is denoted by an additional three backticks. + +We can also add new code blocks by simply typing these elements into the location we want to place a code chunk (as long as we are careful to add 3 backticks also at the end). +::: +::: + +--- + +![](images/12.png) + +--- + +![](images/13.png) + + +--- + +### Running Code + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have two code-chunks written, we can write lines of code within them. For this example, I will use two beginner friendly functions, print("Hello"), which will print the contents contained between the " " to the console, and getwd() which will return the location of the folder you are working within (ie. the working directory). + +To run/execute these lines of code, we have a couple options. We can click on the Run Cell option that appears on the upper-left side of the code chunk. Additionally, it has a companion option that will run all code chunks above it. +::: +::: + +--- + +![](images/14.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When a code block is successfully run, you will see within the console (lower bottom of the screen) the line of code be run, with any returned outputs appear directly after. +::: +::: + +--- + +![](images/15.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +An alternative to clicking the Run Cell button is to click on the line of code you are interested in running, then press (Ctrl + Enter)/(Command + Enter). This will execute the line of code that you have clicked on. This can be useful in scenarios where you want to run a specific line, and not the entire code-chunk. +::: +::: + +--- + +![](images/16.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Using this approach, you can see the location (ie. file path) of the current working directory was returned to the Console. +::: +::: + +--- + +![](images/17.png) + + +--- + +## Local Version Control + +::: {.fragment} +::: {.callout-tip title="."} +Having introduced the main elements of a [Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) file, let's turn our attention to the tab within the editor showing our newly created .qmd file. + +We can see there is a solid circle next to the file name, and it is appearing as green. The circle denotes unsaved changes, which we can correct by clicking on the Save Button to save the changes to our file. +::: +::: + +--- + +![](images/18.png) + + +--- + +### Untracked + +::: {.fragment} +::: {.callout-tip title="."} +If we turn our attention to the left primary sidebar, we can see that within our GitPractie folder there are three files, our Example.qmd, and the default README.md and .gitignore files. These all show up in green text with U's to the right of the file names. + +This denotes that the version control tracking software Git is currently considering them as "Untracked" files. While saving the document via the Save button means we will still have our changes when we reopen Positron, we won't have any history of changes that we can use to revert back to the way all the files appeared at this exact point in time should something go wrong. + +We will next go the address bar on the very far left, and select the Git tab. +::: +::: + +--- + +![](images/19.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the Git tab, we can see that each of the three files are shown underneath a "Changes" drop-down. This contains the files that have undergone changes since the last commit. In our case, since we haven't updated the save-state yet, this last commit would be the initial creation of the project folder. +::: +::: + +--- + +![](images/20.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To have version control track these individual files going forward, we can do so in two separate ways. We can add them individually by clicking the + symbol next to the individual names. +::: +::: + +--- + +![](images/21.png) + + +--- + +### Staged + +::: {.fragment} +::: {.callout-tip title="."} +This will result in the files being moved to the "Staged" dropdown. This denotes files being tracked with the intention of being recorded as the next save-state or waypoint (ie. a commit). +::: +::: + +--- + +![](images/22.png) + + +--- + +### Commit + +::: {.fragment} +::: {.callout-tip title="."} +To create a new commit (save-state or waypoint), once we have the files we want to track staged, we will write a commit message, and then press commit. + +A commit message is a brief description of the changes that have occurred to the files between this commit and the previous one. Make this short description informative enough that if you need to revert back in the future, you can quickly identify the commit you need to fall back to (more about this later). +::: +::: + +--- + +![](images/23.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If this your first time using version control, you will likely encounter the following pop-up asking that you provide a user.name and user.email. This is used to designate the author of the changes.If you get this popup, go ahead and select "Open Git Log" +::: +::: + +--- + +![](images/24.png) + + +--- + +### UserName and UserEmail + +::: {.fragment} +::: {.callout-tip title="."} +The Output tab at the bottom of the screen will open, showing the messages that led to the popup. + +The important part to note is the commands that will be needed to provide your user name and email to the computer for authoring the commit. Typically, your email will be the same one you used for your GitHub account. +::: +::: + +--- + +![](images/25.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From the displayed message, go ahead and copy + +"git config –global user.email "you\@example.com"" + +Then click on the adjacent terminal tab. You will paste the command in, but do not hit enter just yet. + +Windows users, please note, depending on your settings, if trying to paste from the keyboard into the terminal, you may need to press "Ctrl + Shift + V" instead of the usual "Ctrl + V". +::: +::: + +--- + +![](images/26.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the command now pasted (or typed), use your keyboard arrows to navigate to the email portion, and replace the generic email with your email address used for your GitHub account. + +Make sure that the quotation marks (") around the email address remain present, as they help the computer identify where your email address starts and ends. Once satisfied that your email address is correct, press enter. +::: +::: + +--- + +![](images/27.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next up, repeat the process, this time copying over the command needed to set your user name to the terminal. Repeat the editing process to provide your name between the "" marks. Then press enter. +::: +::: + +--- + +![](images/28.png) + +--- + +![](images/29.png) + + +--- + +### First Commit + +::: {.fragment} +::: {.callout-tip title="."} +Now that your user.name and email address have been provided, Git should be able to provide an author to the commit message. Reattempt to press commit button. + +If this is successful, you will see your initial commit appear on the bottom half of the left primary side bar, under the Graph dropdown. Congrats! Your files are now being tracked by version control. +::: +::: + +--- + +![](images/30.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you hover with your mouse arrow just over the commit, you can see the longer commit message and additional details appear. + +If you click on the commit tab, a new display will open in the editor, displaying the changes that occured in that commit compared to the previous one. In this case, since we added everything since the previous commit, nothing appears on the left side, while the entire documents contents appear highlighted in green on the right. + +Green highlighting is used to show additions, while red highlighting is used to show deletions. +::: +::: + +--- + +![](images/31.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having completed this initial commit, for this example, let's imitate a typical workflow and make some additional changes to the file before we make a second commit. Within text portions of the .qmd file, use of \# denotes a section header in markdown, so let's add a header for Introduction and click save. +::: +::: + +--- + +![](images/32.png) + + +--- + +### Modified + +::: {.fragment} +::: {.callout-tip title="."} +Within the left primary sidebar, we can see that the Git tracking has updated. Examples.qmd is visible once again. However, becuase it is now a tracked file, instead of showing up with the "U/Untracked" green highlight, it now appears as a brownish-red with a "M/Modified". + +Let's make an additional change to the .qmd file by adding another section (# Setup) and a code block with a commented out line (denoted by the \# at the line start), before pressing Save. +::: +::: + +--- + +![](images/33.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were now to click on the Example.qmd file in the left primary sidebar, it will open the same kind of tracking display we saw previously. This time, we can see changes since our last commit. These appear as the green highlights along the scroll-bar, corresponding to the \# Introduction and \# Setup headers that we have added in since the last commit. +::: +::: + +--- + +![](images/34.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For a larger document, we can scroll down to see the various highlighted regions. +::: +::: + +--- + +![](images/35.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We could now repeat the steps showed above, staging the file, writing a commit message, and commiting again by clicking on the designated buttons. + +An important question is how often should we commit, vs. just hit save? Well... it depends :D +Let's think about this in context of a video game. If you made commits at regular intervals throughout the day (or more frequently when doing something particularly risky), you are more likely to be close enough to a particular commit (waypoint/save-state) that you can quickly revert back to without loosing any progress. Alternatively, if your last commit was last week, you will not have any intermediate versions to fall back to. +::: +::: + +### Commit via Terminal + +::: {.fragment} +::: {.callout-tip title="."} +Having demonstrated how to commit changes to Git via the left primary side-bar, for this second commit, let's do it the alternate way via the terminal (tab on the panel at the bottom of your screen). +::: +::: + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After clicking on the terminal tab, click on blinking command line. + +The command to stage a file is "git add ", followed by the name of the file you want to stage. + +In this case, you would enter "git add Example.qmd" and press Enter. +::: +::: + +--- + +![](images/36.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will see after pressing enter a new blank terminal line appear. If you glance at the left-sidebar, you can see that Example.qmd now appears under the Staged Changes dropdown. +::: +::: + +--- + +![](images/37.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next up, let's write the git commit via the terminal. In this case, the command would be "git commit -m " (-m denoting message). The commit text is then surrounded by "" marks. + +For example: "git commit -m "Added section headers to my QMD file"" + +Press enter to save the commit. +::: +::: + +--- + +![](images/38.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And you should see your second commit now appear in the left primary sidebar underneath the graphs dropdown. +::: +::: + +--- + +![](images/39.png) + + +--- + +## Remote Version Control + +### Copying Project Folder to GitHub + +::: {.fragment} +::: {.callout-tip title="."} +While having local version control in place is helpful when you need to revert back after encountering issues, where Git shines is the ability to pass your changes to your online GitHub repository. + +Not only does this allow you to switch between computers, but should something disastrous happen to your main computer, you still have all your hard work backed up and readily assessible. + +For this subsection, first, double check that Positron is still connected to your GitHub account by checking the user tab on the bottom-left. If not, repeat the [connection setup](/course/00_WorkstationSetup/Windows.qmd#connecting-github-and-positron). +::: +::: + +--- + +![](images/40.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Since our project was created using the "New Folder from Template" option, it currently only exist locally. What we want to do next is to copy it to our GitHub account, creating a new repository in the process. + +To do this, we will first need to install the `usethis` R package. Within your console, you would run the following line of code: +::: +::: + +```{r} +#| eval: false +install.packages("usethis") +``` + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Depending on what R packages you already have installed on your computer, you may get a prompt asking if you want to update/install additional dependencies. Go ahead and type the number corresponding to Update All, and press enter. + +The package and all it's dependencies should then install. If an error message appears, read through it, and follow provided instructions. Go to [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) +if need help. +::: +::: + + +---- + +::: {.fragment} +::: {.callout-tip title="."} +Once the `usethis` package is installed, we need to activate it within R by calling it with the library command. This makes all the tools (ie. functions) within an R package available for use within Positron. + +In your console, you would type: +::: +::: + +```{r} +#| eval: FALSE +library(usethis) +``` + +--- + +![](images/46.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With library called, you now have access to the functions (tools) within the `usethis` R package. One of these is the `use_github()` function. + +In Positron, if you hover over a function, it will pull up the associated help file which will provide you information about the arguments the function expects to receive, and what they do. + +For `use_github()`, the main thing to remember for now is since this is a personal project being used for testing, we don't necessarily want to share it with the entire world, so we should set the "private" argument equal to TRUE when creating a new repository. +::: +::: + +--- + +![](images/46.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Taking this information that we have now gathered, we can now within our Quarto Markdown create a code chunk, write out the line of code calling the function, and providing the Private=TRUE argument within the (). + +Within a code chunk, adding a \# in front of a line of code, will comment it out, resulting in that line of code not being run. Since we have already installed the `usethis` package, and we don't want to reinstall it every single time, let's go ahead and comment out that line. Go ahead and press Enter. +::: +::: + +--- + +![](images/47.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will see a message pop-up in the console. In this case, we had not saved before pressing enter, so there are uncommitted changes within the folder. The pop-up is asking whether you want to save these as well before sending the Folder to GitHub. + +In this case I will chose to ignore the uncommitted changes by entering 3 (for Definitely) in the console and hitting enter on my keyboard. +::: +::: + +--- + +![](images/48.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The `usethis` R package will then execute the series of git commands that are needed to set up a GitHub repository (ie. the messages being displayed in the console window), and when finished will open a pop-up asking whether you want to see your new repository in your default Web Browser. I will go ahead and select yes in this case. +::: +::: + +--- + +![](images/49.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After the browser opens, you can see that the elements I had staged and committed within Positron are now present within the GitHub repository. +Since I had only staged Example.qmd, it is the only file that was backed up. We can also see the commit history online by clicking on the commit clock. +::: +::: + +--- + +![](images/50.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we would expect, we only see our two commit messages. One important thing to note is the commit hash numbers, that denote a particular commit. If we decided to revert/fall back to a prior commit in the future, this would be the number we would need to provide to Git to return to that previous commit/save-state +::: +::: + +--- + +![](images/51.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similarly, on GitHub, we have an option to Browse a Repository at a particular point in time. This will be quite useful later in the future when troubleshooting what major changes occurred between versions of an R package. +::: +::: + +--- + +![](images/52.png) + + +--- + +### Code Chunk Arguments + +::: {.fragment} +::: {.callout-tip title="."} +Having successfully connected our local Project Folder to a remote GitHub repository, let's return to Positron. + +Before continuing, if we left the code chunk that created the GitHub repository as is, every time we ran all code chunks in the document, it would try to recreate the GitHub repository. We don't want this to happen, as the setup was a one-time operation. + +While we could add \# in front of every line of code (or delete the code chunk entirely) it is often useful to have these set-up code chunks around to remind us what arguments we need to provide next time we need to a similar setup and are mind blanking on what to do. + +Fortunately, Quarto allows us to set conditions on whether a chunk is run (ie. evaluated). We will discuss the conditiona arguments in more depth in the [next section](/course/00_Quarto/index.qmd), but for now, we can modify the code chunk as follows. + + +On the next line after the {r}, we will add a hashtag (\#), then a pipe (|), followed by a space. This is the setup for a code-chunk specific argument. We will then add "eval: FALSE", which signals that the particular code-chunk should not be evaluated (ie, should not be run). +::: +::: + +--- + +![](images/53.png) + + +--- + +### README + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have connected our local Project Folder to GitHub, and have gotten a basic introduction to the "git add", "git commit" arguments, let's turn our focus to the other files currently listed as untracked by Git within our folder, the README.md and the .gitignore files. + +When setting up our [GitHub]() account, we encounted an example of a README.md file. This file often provides a brief description of the project, and an outline of what the other files in the folder are for. As you may have gathered, even software developers are forgetful/under-caffenaited, and having notes to catch back up to speed is important. +::: +::: + +--- + +![](images/54.png) + + +--- + + +### .gitignore + +::: {.fragment} +::: {.callout-tip title="."} +We additionally have a .gitignore file. Within a project, there are often some files that we will never want version control to track. These could be files that are too large for GitHub (ex. really large .fcs files), or files containing sensitive information (passwords, history, credentials, etc.). + +When the names of these file (or the file type shothand) are added to the .gitignore file, they are ignored by version control, and no longer appear on the primary left side bar. +::: +::: + +--- + +![](images/54.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's proceed and stage both the README.md and .gitignore file, so that changes to these files will be tracked. We can of course select both from the primary left side bar and write a short commit message. +::: +::: + +--- + +![](images/55.png) + +--- + +![](images/56.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Or alternatively, if we want to stage all uncommitted files present in a single step, we could in the terminal use the "git add ." + +We can then write our git commit using "git commit -m". + +Both approaches work, and you may switch between them based on preferrence. +::: +::: + +--- + +![](images/57.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice after having committed, that if you look at the Graph dropdown on the bottom half of the primary left side-bar that something has changed. + +There are now separate icons denoted as main and origin/main. These correspond to the last commit present locally (main), and the last commit on remote (ie. GitHub, origin/main). + +Local is ahead since you just made the commit with the changes inactivating the code-chunk, and you have not passed these changes up to GitHub yet. +::: +::: + +--- + +![](images/58.png) + + +--- + + +### Pull + +::: {.fragment} +::: {.callout-tip title="."} +Before sending (ie. pushing up) our updated commit to GitHub, especially if you are working on a project from multiple computers (or as part of a team) to bring in (ie. pull down) any changes that might be on GitHub that are not present locally. + +This ensures that everything is up to date, and you don't end up with mismatched commits that are incompatible with each other and trigger an error message. + +To pull in changes from GitHub, at the top of the primary left side-bar, you can select the ... button to open a drop-down menu of Git options. You would then select "Pull". + +Alternatively, you could do the same thing via the terminal by running the "git pull" command. +::: +::: + +--- + +![](images/59.png) + + +--- + +### Push + +::: {.fragment} +::: {.callout-tip title="."} +In our case, there was no new material present on our GitHub repository that were not already present locally, so all that is returned is the "Already up to date" message. + +We are now good to proceed to push (ie. send) the updated commit up to our GitHub repository. + +We can do this by either pressing the Sync changes button, or via the terminal entering the "git push" command. +::: +::: + +--- + +![](images/60.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And now, if you glance down at left side-bar's graph section, you will see that both the main and origin/main icons are now present for the most recent commit. +::: +::: + +--- + +![](images/61.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we switch to our Web browser, we can see that this is also now the case for our GitHub repository that now also has the most recent changes. +::: +::: + +--- + +![](images/62.png) + + +--- + +### Reverting to Prior Commit + +::: {.fragment} +::: {.callout-tip title="."} +For most daily-workflows, you will only need the git commands that we have introduced above (git add, commit, pull, push). The next two areas (reverting to a prior commit, and branches) are more specialized, and will be covered in greater depth later in the course. We are briefly covering them here. If you are at the point where your last remaining neuron has disconnected, and you feel you need to take a break from version control, feel free to skip to the [next section](/course/00_Quarto/index.qmd) and we will revisit these topics later in the course. +::: +::: + + +-- + +::: {.fragment} +::: {.callout-tip title="."} +In most cases, if your code stops working, you can identify the issue and fix it in the existing version, never needing to resort to reverting to a previous commit (save-state). The times you would need to revert would be if you deleted important files, or the new files are hopeless mess that is not worth trying to sort through. In those cases, reverting back might be better approach. + +To imitate a falling back scenario, lets create and additional file, stage and commit it to end up a commit ahead of where we are currently at within the Project Folder. +::: +::: + +--- + +![](images/00_RevertTest.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Now being one (or several) commits ahead, if we wanted to revert back, we would first need to identify the commit we want to revert back to and copy the commit hash number. +::: +::: + +--- + +![](images/00_CommitHash.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then, opening the terminal, we can enter "git reset " and paste the hash afterwards. We can then press enter. +::: +::: + +--- + +![](images/00_GitReset.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice our additional commit has been removed, although the newer files we were working on subsequent last commit are still present. +::: +::: + +--- + +![](images/00_GitResetExecuted.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If however, we had wanted to return to the exact same state as the previous commit (removing all subsequent created files), we could do so by adding in the --hard argument. Before starting, save any newer files you want to keep in a completely different folder, because they will be permanently removed. + +Then, enter "git reset --hard thecommithashnumber" into the terminal, which would result in a "hard" return to the previous commits save-state. You may need to close and reopen Positron to see the changes reflected. +::: +::: + +--- + +### Branches + +::: {.fragment} +::: {.callout-tip title="."} +Branches are an useful Git feature that we will start using extensively later in the course. Branching allows you to create a parallel/carbon-copy of your existing repository, which you can then edit without affecting the main branch. This is particularly useful for projects that may get messy or drawn out. By isolating these edits to a parallel branch, if they don't work, your main branch remains safe. Alternatively, if you like the changes that occurred in the branch, you can pull these changes from the branch back to main, bringing the timelines back together. +::: +::: + +![](https://book.the-turing-way.org/build/sub-branch-491000deab04cb25ea703c007e2ebdd2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Within the terminal, entering "git branch" will show the existing branches. In this case, only main is present since we haven't yet created a new branch. +::: +::: + +--- + +![](images/00_Branch.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can create a new branch in the terminal by entering "git branch " followed by the name of our desired branch. In this case, we are creating a branch called Week1 +::: +::: + +--- + +![](images/00_Week1.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Now, when we check "git branch" again in the terminal, which returns the two branches, Week1 and main. The \* is located next to main, indicating that we are currently within the main branch. +::: +::: + +--- + +![](images/00_Branches.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Besides the terminal, we can also create a new branch via Positron. To do so, we first click on the Git tab in the Actions Bar. + +Once the left-side bar displays the version control display, we can click on the ... button (to the right of changes)to gain access to the Git options drop-down. + +From here, we click on Branch, and then select Create Branch. +::: +::: + +--- + +![](images/00_BranchesGUI.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Using Git branch, we saw that we were still within the main branch. In the terminal, we can switch over to the Week1 branch by using the "git checkout " command, followed by the branch we wish to switch to. +::: +::: + +--- + +![](images/00_Checkout.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This results in us switching over to the Week1 branch. +::: +::: + +--- + +![](images/00_CheckoutOutput.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having switched (ie. checkout) to the Week 1 branch, let's create the file BranchTest.qmd, which will exist within this branch, but not yet in the main branch. +::: +::: + +--- + +![](images/00_BranchTest.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having created the file, let's stage and then commit it. This will put the Week1 branch ahead of the main branch by a single commit. +::: +::: + +--- + +![](images/BranchCommit.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With our changes staged and committed, if we look at the left side-bar's graph section, our Week1 branch is now ahead of the origin/main branch by one commit. +::: +::: + +--- + +![](images/00_BranchToOrigin.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were to check on GitHub, we can see that no new files are present on the main branch, but can see the notification listing recent changes to Week1 branch. +::: +::: + +--- + +![](images/00_GitHub.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Using the drop-down, we can switch from displaying the main branch to the Week1 branch, where we can see the new file. +::: +::: + +--- + +![](images/00_GitHubWeek1.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we click the green compare and pull request button, we end up on this screen. This compares how the two branches are different from each other. +::: +::: + +--- + +![](images/00_GithubWeek1Merge.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will delve into branches again at a later point. For now, remember that by creating and prunning parallel branches, you can develop knowing that even if something goes wrong, your main branch remains safe. +::: +::: + +--- + +# Wrap-Up + +::: {.fragment} +::: {.callout-tip title="."} +In this section, we saw how to create a New Project Folder, create files and back up the project folder to GitHub. We also started learning about git, covering the basic commands (git add, commit, pull, push). If you feel a bit overwhelmed, please know, that is normal. Understanding how to leverage git takes time and practice, but is an incredibly valuable skillset to have in the long run. + +In the [next section](/course/00_Quarto/index.qmd), we will look at how by changing various elements within our .qmd file produce a variety of files, and how to leverage code-chunk arguments to fine-tune whether a code-chunk is utilized. +::: +::: + +# Additional Resources + +[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) + +[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) + +[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_GitHub/index.qmd b/course/00_GitHub/index.qmd index 77e1bdd..f123e2a 100644 --- a/course/00_GitHub/index.qmd +++ b/course/00_GitHub/index.qmd @@ -1,406 +1,406 @@ ---- -title: "Using GitHub" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/PDz0R9jdVfc?si=gtdIAye2q3ZWPJzs) - - - -For screen-shot slides, click [here](/course/00_GitHub/slides.qmd) - -# Background - -When working with code, it is very important to stay organized. You ultimately want to avoid being in a scenario where you need some code you wrote the previous month, and then having to search through multiple .R files, scattered across multiple folders, external hard-drives, and computers to find it. Likewise, you want to avoid ending up having identified multiple similarly-named copies of your original file that have all since diverged slightly from each other in some way that you have long since forgotten. - -![](https://phdcomics.com/comics/archive/phd101212s.gif){width=50%} - -Ideally, everything needed for your coding script to successfully run should be kept within a project-specific folder. This ensures, that should you transfer it to another computer (whether your own or a colleagues) that you would still be able to recreate the scripts output. - -Likewise, if you make changes to your script, and your code stops working (no longer returns the expected output, ie. breaks), having a record of what changes were made since the last working version would be very helpful in pinpointing what went wrong. For beginners, this often ends up being a typo in a function name, or an accidentally misplaced comma somewhere in your document. - -For these reasons, in this course, we will be extensively using the version control software [Git](https://git-scm.com/) from the very beginning. We will also have you create a [GitHub](https://github.com/) account, which will allow you to back-up your coding projects online as private repositories. Not only is this useful in case something happens to your computer, but it allows you to switch between separate computers while still having ready access to all your code, avoiding ending up with divergent copies on each computer. - -Additionally, since all the material for this course is being hosted on a public GitHub repository, once you have set up your GitHub account you will be able to retrieve all the new materials and changes by simply refreshing (ie. syncing) your version of the course folder (ie. fork) once a week. Your GitHub account will also be needed when posting or asking questions on the [Discussion Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions). - -In this walk-through, we will go through setting up a GitHub account, and make sure you are familiar with some of the elements and locations that we will be circling back to throughout the course. - ---- - -# Getting Started - - -## Creating an Account - -We will first navigate to the [GitHub homepage](). If you haven't previously created an account, click on the button to sign up for an account. - -![](images/01_GitHub.png) - -
- ---- - -On the sign-up page, you will fill in various details needed to create an account. Please remember that GitHub usernames are visible to others. Additionally, if you end up sharing code with others as part of a manuscript, or use GitHub to create a personal portfolio website in the future, your username will appear as part of the URL. - -For example, in my case, my user name is DavidRach, so my GitHub profile ends up as: [https://github.com/DavidRach](https://github.com/DavidRach). For our course, the core's GitHub user name is UMGCCCFCSR, so the github profile ends up as [https://github.com/UMGCCCFCSR](https://github.com/UMGCCCFCSR), while the course website ends up as [https://umgcccfcsr.github.io/CytometryInR/](https://umgcccfcsr.github.io/CytometryInR/) - -![](images/02_GithubSignup.png) - -
- ---- - -Once you have entered your new account information, you will need your account creation by entering the code sent to the email address that you provided. - -![](images/03_Github2Factor.png) - -
- ---- - -Once account creation has been confirmed, please proceed to login to GitHub for the first time. - -![](images/04_Login.png) - -
- ---- - -## GitHub Profile - -Upon creating a brand new account, your GitHub homepage will initially look rather empty, and can be intimidating to navigate for the first time. - -For now, on the upper right, go ahead and click on the default profile picture icon... - -![](images/05_YourIcon.png) - -
- ---- - -And then select Profile... - -![](images/05_Profile.png) - -
- ---- - -You are now on your public GitHub profile page. For a newly created account, it will look something like this: - -![](images/06_EditIcon.png) - -
- ---- - -For a more established account, this page will look a [little different](https://github.com/DrCytometer), and can be customized to highlight various projects that you are working on. - -For this course, we will have you set up a basic GitHub profile page for now, although you are free to customize and personalize it as much as you may want to in the future! - -To start, first select the edit profile button on the left below the default profile icon. - -![](images/06_EditIcon.png) - -
- ---- - -You can then proceed to fill in any details that you feel are relevant and are comfortable sharing. - -![](images/07_Basics.png) - -
- ---- - -With the quick access details filled in, it is now time to navigate to the Settings tab. You will return to the previous menu dropdown on the upper right, and instead of selecting Profile, click on the Settings option. - -![](images/05_Profile.png) - -
- ---- - -You should now end up within your Public Profile Settings page. - -Feel free to edit the default profile picture, and any other fields that you feel are relevant. Once done, continue to scroll down the page past ORCID ID. - -![](images/08_ProfileSetup.png) - -
- ---- - -When you reach Contributions and Activity, go ahead and select the option to include private repositories in the activity summary graphic. Then scroll down and click save. You will now be returned to your GitHub profile page. - -![](images/09_SelectThisOneSuggested.png) - -
- ---- - -At the top of the profile, you will see a "Your contributions" calendar graph. For a new account, it will look like this: - -![](images/10_UpdatedGitHubProfile.png) - -
- ---- - -If you are just starting out, this chart will be mostly empty, but will fill in as you work on projects, see [here](https://github.com/cararthompson) as an example. - -Every time you save your code (ie. make a commit), the activity will be reflected in this chart. By clicking the option in settings, code made within a private repository will remain private, but will count toward your contribution chart. As you progress through the course, this will provide a nice visual reminder of the progress you have made, and the obstacles that you have overcome. - -![](images/10_UpdatedGitHubProfile.png) - -
- ---- - -## GitHub ReadMe - -With this done, we modify your GitHub profile by adding one customized element, a ReadMe page. This will be used for a couple projects during the course, and can be personalized further in the future. - -To create a ReadMe page for your profile, we will navigate to the upper right of the screen and click on the + sign. - -![](images/11_UpdatedGitHubProfile2.png) - -
- ---- - -We will then select the Create New Repository option. - -![](images/12_NewRepository.png) - -
- ---- - -You will next create a repository (folder), naming it exactly the same as your username. This will be recognized by GitHub as being a special type of repository corresponding to the ReadMe section of your profile. - -For options, leave the visibility as Public, and Add README set to On. And proceed to Create Repository. - -![](images/13_ReadMe.png) - -
- ---- - -Having created the repository (folder), you will see it has been populated by a few default files. For now, you will be editing the README.md file. On a new repository, the easiest way to access it is by clicking the green option on the right side of your screen. - -![](images/14_EditButton.png) - -
- ---- - -With the README.md file now opened, you will be able to see generic filler text that is suggested by GitHub. - -For this course, I will ask you to add a couple elements for now. You are free to return and further personalize it later if you wish to do so. - -![](images/15_DefaultText.png) - -
- ---- - -The type of file that we are working with is a [Markdown](https://www.markdownguide.org/basic-syntax/) file, which can allow for a bunch of customizations which we will cover throughout the course. - -For now, please add and customize the following questions: - -**Cytometry In R** - -Location: Baltimore, Maryland, USA - -My Favorite Fluorophore/Metal-Isotope: Spark Blue 550 - -Previous Coding Experience: Repeatedly Calling IT - -What I Hope to Get From This Course: A faster way to match FlowSOM clusters to their likely cell type. - -![](images/16_ReadMeContent.png) - -
- ---- - -Next, to save you will select the green "Commit changes" button. We will cover the meaning of "Commit" more in-depth during the [Git](/course/00_Git/index.qmd) section. - -For now, write a short summary of the change you made to the file in the "Commit message", and any additional details within the "Extended description" field. When ready, click the green "Commit changes" button. - -![](images/17_ReadMeCommit.png) - -
- ---- - -You will now be able to see the updated README.md file, as you can see in our example below. To make additional edits, you would select the pencil icon on the right-center side of the screen. - -![](images/18_ReadMeRendered.png) - -
- ---- - -Next, navigate back to your profile page (by clicking on either your username or the Overview option on the tabs). - -You will see that the README file contents are now displayed on the upper portion of your GitHub profile. Feel free to circle back and customize this further to your liking. - -In this last example, we created your first repository (folder). Since this is public, it is now shown below the README section of the profile under your repositories. You can also see that your commits made in the process of making the changes are now shown both in the Contributions graph, and under the Contributor Activity summary at the bottom of the page. - -![](images/19_UpdatedProfile.png) - -
- ---- - -## GitHub Repository - -Having set up your GitHub profile, it now is time to make sure you have access to our course materials. We will have you navigate to our course's [GitHub profile](https://github.com/UMGCCCFCSR) - -On the profile page, you will be able to see our version of the README, our repositories, and the Contributions graph and Contribution activity sections. - -Please click on the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR) to navigate to its repository (folder) - -![](images/20_ToCourseProfile.png) - -
- ---- - -On this page, you will see several elements that you will be circling back to throughout the course. - -For our course, we will be extentsively ussing the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page as a community forum. If you have any questions, are looking for feedback, or want to show off something that you worked on, this is the place for it. This will also help make sure - -![](images/21_Discussions.png) - -
- ---- - -The [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) tab is where you will need to go to open an Issue if you encounter a bug (or major documentation typo), so that I can cicle back and correct them when I have the chance. - -![](images/21_BugReports.png) - -
- ---- - -To submit the optional take-home problems, you would turn in these problems by going to the [Pull Request](https://github.com/UMGCCCFCSR/CytometryInR/pulls) tab, and initiating a pull request between your forked version of the project and our "homework" branch (more details on this later). - -![](images/21_HomeworkPullRequest.png) - -
- ---- - -Optionally, you can "Star" a repository. This is basically the GitHub equivalent of liking a project. In our case, we will often star a repository since it will be saved under the Stars tab of our profile, which makes finding it again significantly easier a few weeks later after forgetting the repository name. - -![](images/21_Stars.png) - -
- ---- - -To see projects that you have starred, you can select the Stars option from the same dropdown you used to get to Settings. - -![](images/22_Stars.png) - -
- ---- - -Or from your GitHub profile, you can see these under [Stars](https://github.com/DavidRach?tab=stars) tab. - -![](images/22_YourStarredRepositories.png) - -
- ---- - - -## Forking CytometryInR - -Before we go further, we will need you to make your own copy of the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/) (ie. fork it). This will allow you to quickly retrieve all the new materials and code corrections by simply rereshing (ie. syncing) your forked version with our upstream parent branch once a week. - -
- ---- - -To fork the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/), you will select the "Fork repository" option on the upper-center portion of your screen. - -![](images/23_ForkIt.png) - -
- ---- - -By "Fork-ing" a repository, you are basically copying the contents from that repository to a newly created repository on your own GitHub. Forked projects are still linked to the original (parent) fork, and can retrieve any updates via syncing, as well as return changes via a pull request. - -For this course, when you create the fork, keep the existing repository name ("CytometryInR"). Importantly, select the copy main branch option. This will ensure you only get the code and data needed for the course copied over, and don't end up with your entire hard-drive filled will website elements, or other people's solutions to the take-home problems. - -![](images/24_ForkMainBranch.png) - -
- ---- - -Once you have created the fork, you will see your copy of the forked repository under your own username. Seeing as you have just now forked the project, you will see the notification that you are up to date with the existing version of the CytometryInR course repository. - -As we go through the course, and new material is released each week on Sunday at 2200 EST (Monday 0300 GMT+0), you will see this changed to behind the main branch by a number of commits, and have the option to sync in the changes to your fork to gain access to that week's material. - -![](images/25_YourForkedBranch.png) - -
- ---- - - -If you remember, previously under your GitHub profile, the Repositories tab only contained the repository corresponding to your ReadMe section. - -![](images/YourRepositories.png) - -
- ---- - -You should however now be able to see your fork of the CytometryInR repository. As you add project specific repositories throughout the course, they will also appear here. - -![](images/YourUpdatedRepos.png) - -
- ---- - -# Wrap-Up - -We have now completed our walk-through of setting up a GitHub account. At this point, you should have modified your GitHub profile, added a README section, and most importantly, forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. - -Next up, we will have you proceed to installing the required software to your computer that will be needed throughout the course. Installation instructions will vary depending on your computer's operating system, so please follow the appropiate walkthrough. - -# Additional Resources - -[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) - -[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) - -[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) - -[How to Use GitHub for Beginners](https://youtu.be/a9u2yZvsqHA?si=lbKBogzjEZ1YehpQ) - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using GitHub" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/PDz0R9jdVfc?si=gtdIAye2q3ZWPJzs) + + + +For screen-shot slides, click [here](/course/00_GitHub/slides.qmd) + +# Background + +When working with code, it is very important to stay organized. You ultimately want to avoid being in a scenario where you need some code you wrote the previous month, and then having to search through multiple .R files, scattered across multiple folders, external hard-drives, and computers to find it. Likewise, you want to avoid ending up having identified multiple similarly-named copies of your original file that have all since diverged slightly from each other in some way that you have long since forgotten. + +![](https://phdcomics.com/comics/archive/phd101212s.gif){width=50%} + +Ideally, everything needed for your coding script to successfully run should be kept within a project-specific folder. This ensures, that should you transfer it to another computer (whether your own or a colleagues) that you would still be able to recreate the scripts output. + +Likewise, if you make changes to your script, and your code stops working (no longer returns the expected output, ie. breaks), having a record of what changes were made since the last working version would be very helpful in pinpointing what went wrong. For beginners, this often ends up being a typo in a function name, or an accidentally misplaced comma somewhere in your document. + +For these reasons, in this course, we will be extensively using the version control software [Git](https://git-scm.com/) from the very beginning. We will also have you create a [GitHub](https://github.com/) account, which will allow you to back-up your coding projects online as private repositories. Not only is this useful in case something happens to your computer, but it allows you to switch between separate computers while still having ready access to all your code, avoiding ending up with divergent copies on each computer. + +Additionally, since all the material for this course is being hosted on a public GitHub repository, once you have set up your GitHub account you will be able to retrieve all the new materials and changes by simply refreshing (ie. syncing) your version of the course folder (ie. fork) once a week. Your GitHub account will also be needed when posting or asking questions on the [Discussion Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions). + +In this walk-through, we will go through setting up a GitHub account, and make sure you are familiar with some of the elements and locations that we will be circling back to throughout the course. + +--- + +# Getting Started + + +## Creating an Account + +We will first navigate to the [GitHub homepage](). If you haven't previously created an account, click on the button to sign up for an account. + +![](images/01_GitHub.png) + +
+ +--- + +On the sign-up page, you will fill in various details needed to create an account. Please remember that GitHub usernames are visible to others. Additionally, if you end up sharing code with others as part of a manuscript, or use GitHub to create a personal portfolio website in the future, your username will appear as part of the URL. + +For example, in my case, my user name is DavidRach, so my GitHub profile ends up as: [https://github.com/DavidRach](https://github.com/DavidRach). For our course, the core's GitHub user name is UMGCCCFCSR, so the github profile ends up as [https://github.com/UMGCCCFCSR](https://github.com/UMGCCCFCSR), while the course website ends up as [https://umgcccfcsr.github.io/CytometryInR/](https://umgcccfcsr.github.io/CytometryInR/) + +![](images/02_GithubSignup.png) + +
+ +--- + +Once you have entered your new account information, you will need your account creation by entering the code sent to the email address that you provided. + +![](images/03_Github2Factor.png) + +
+ +--- + +Once account creation has been confirmed, please proceed to login to GitHub for the first time. + +![](images/04_Login.png) + +
+ +--- + +## GitHub Profile + +Upon creating a brand new account, your GitHub homepage will initially look rather empty, and can be intimidating to navigate for the first time. + +For now, on the upper right, go ahead and click on the default profile picture icon... + +![](images/05_YourIcon.png) + +
+ +--- + +And then select Profile... + +![](images/05_Profile.png) + +
+ +--- + +You are now on your public GitHub profile page. For a newly created account, it will look something like this: + +![](images/06_EditIcon.png) + +
+ +--- + +For a more established account, this page will look a [little different](https://github.com/DrCytometer), and can be customized to highlight various projects that you are working on. + +For this course, we will have you set up a basic GitHub profile page for now, although you are free to customize and personalize it as much as you may want to in the future! + +To start, first select the edit profile button on the left below the default profile icon. + +![](images/06_EditIcon.png) + +
+ +--- + +You can then proceed to fill in any details that you feel are relevant and are comfortable sharing. + +![](images/07_Basics.png) + +
+ +--- + +With the quick access details filled in, it is now time to navigate to the Settings tab. You will return to the previous menu dropdown on the upper right, and instead of selecting Profile, click on the Settings option. + +![](images/05_Profile.png) + +
+ +--- + +You should now end up within your Public Profile Settings page. + +Feel free to edit the default profile picture, and any other fields that you feel are relevant. Once done, continue to scroll down the page past ORCID ID. + +![](images/08_ProfileSetup.png) + +
+ +--- + +When you reach Contributions and Activity, go ahead and select the option to include private repositories in the activity summary graphic. Then scroll down and click save. You will now be returned to your GitHub profile page. + +![](images/09_SelectThisOneSuggested.png) + +
+ +--- + +At the top of the profile, you will see a "Your contributions" calendar graph. For a new account, it will look like this: + +![](images/10_UpdatedGitHubProfile.png) + +
+ +--- + +If you are just starting out, this chart will be mostly empty, but will fill in as you work on projects, see [here](https://github.com/cararthompson) as an example. + +Every time you save your code (ie. make a commit), the activity will be reflected in this chart. By clicking the option in settings, code made within a private repository will remain private, but will count toward your contribution chart. As you progress through the course, this will provide a nice visual reminder of the progress you have made, and the obstacles that you have overcome. + +![](images/10_UpdatedGitHubProfile.png) + +
+ +--- + +## GitHub ReadMe + +With this done, we modify your GitHub profile by adding one customized element, a ReadMe page. This will be used for a couple projects during the course, and can be personalized further in the future. + +To create a ReadMe page for your profile, we will navigate to the upper right of the screen and click on the + sign. + +![](images/11_UpdatedGitHubProfile2.png) + +
+ +--- + +We will then select the Create New Repository option. + +![](images/12_NewRepository.png) + +
+ +--- + +You will next create a repository (folder), naming it exactly the same as your username. This will be recognized by GitHub as being a special type of repository corresponding to the ReadMe section of your profile. + +For options, leave the visibility as Public, and Add README set to On. And proceed to Create Repository. + +![](images/13_ReadMe.png) + +
+ +--- + +Having created the repository (folder), you will see it has been populated by a few default files. For now, you will be editing the README.md file. On a new repository, the easiest way to access it is by clicking the green option on the right side of your screen. + +![](images/14_EditButton.png) + +
+ +--- + +With the README.md file now opened, you will be able to see generic filler text that is suggested by GitHub. + +For this course, I will ask you to add a couple elements for now. You are free to return and further personalize it later if you wish to do so. + +![](images/15_DefaultText.png) + +
+ +--- + +The type of file that we are working with is a [Markdown](https://www.markdownguide.org/basic-syntax/) file, which can allow for a bunch of customizations which we will cover throughout the course. + +For now, please add and customize the following questions: + +**Cytometry In R** + +Location: Baltimore, Maryland, USA + +My Favorite Fluorophore/Metal-Isotope: Spark Blue 550 + +Previous Coding Experience: Repeatedly Calling IT + +What I Hope to Get From This Course: A faster way to match FlowSOM clusters to their likely cell type. + +![](images/16_ReadMeContent.png) + +
+ +--- + +Next, to save you will select the green "Commit changes" button. We will cover the meaning of "Commit" more in-depth during the [Git](/course/00_Git/index.qmd) section. + +For now, write a short summary of the change you made to the file in the "Commit message", and any additional details within the "Extended description" field. When ready, click the green "Commit changes" button. + +![](images/17_ReadMeCommit.png) + +
+ +--- + +You will now be able to see the updated README.md file, as you can see in our example below. To make additional edits, you would select the pencil icon on the right-center side of the screen. + +![](images/18_ReadMeRendered.png) + +
+ +--- + +Next, navigate back to your profile page (by clicking on either your username or the Overview option on the tabs). + +You will see that the README file contents are now displayed on the upper portion of your GitHub profile. Feel free to circle back and customize this further to your liking. + +In this last example, we created your first repository (folder). Since this is public, it is now shown below the README section of the profile under your repositories. You can also see that your commits made in the process of making the changes are now shown both in the Contributions graph, and under the Contributor Activity summary at the bottom of the page. + +![](images/19_UpdatedProfile.png) + +
+ +--- + +## GitHub Repository + +Having set up your GitHub profile, it now is time to make sure you have access to our course materials. We will have you navigate to our course's [GitHub profile](https://github.com/UMGCCCFCSR) + +On the profile page, you will be able to see our version of the README, our repositories, and the Contributions graph and Contribution activity sections. + +Please click on the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR) to navigate to its repository (folder) + +![](images/20_ToCourseProfile.png) + +
+ +--- + +On this page, you will see several elements that you will be circling back to throughout the course. + +For our course, we will be extentsively ussing the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page as a community forum. If you have any questions, are looking for feedback, or want to show off something that you worked on, this is the place for it. This will also help make sure + +![](images/21_Discussions.png) + +
+ +--- + +The [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) tab is where you will need to go to open an Issue if you encounter a bug (or major documentation typo), so that I can cicle back and correct them when I have the chance. + +![](images/21_BugReports.png) + +
+ +--- + +To submit the optional take-home problems, you would turn in these problems by going to the [Pull Request](https://github.com/UMGCCCFCSR/CytometryInR/pulls) tab, and initiating a pull request between your forked version of the project and our "homework" branch (more details on this later). + +![](images/21_HomeworkPullRequest.png) + +
+ +--- + +Optionally, you can "Star" a repository. This is basically the GitHub equivalent of liking a project. In our case, we will often star a repository since it will be saved under the Stars tab of our profile, which makes finding it again significantly easier a few weeks later after forgetting the repository name. + +![](images/21_Stars.png) + +
+ +--- + +To see projects that you have starred, you can select the Stars option from the same dropdown you used to get to Settings. + +![](images/22_Stars.png) + +
+ +--- + +Or from your GitHub profile, you can see these under [Stars](https://github.com/DavidRach?tab=stars) tab. + +![](images/22_YourStarredRepositories.png) + +
+ +--- + + +## Forking CytometryInR + +Before we go further, we will need you to make your own copy of the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/) (ie. fork it). This will allow you to quickly retrieve all the new materials and code corrections by simply rereshing (ie. syncing) your forked version with our upstream parent branch once a week. + +
+ +--- + +To fork the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/), you will select the "Fork repository" option on the upper-center portion of your screen. + +![](images/23_ForkIt.png) + +
+ +--- + +By "Fork-ing" a repository, you are basically copying the contents from that repository to a newly created repository on your own GitHub. Forked projects are still linked to the original (parent) fork, and can retrieve any updates via syncing, as well as return changes via a pull request. + +For this course, when you create the fork, keep the existing repository name ("CytometryInR"). Importantly, select the copy main branch option. This will ensure you only get the code and data needed for the course copied over, and don't end up with your entire hard-drive filled will website elements, or other people's solutions to the take-home problems. + +![](images/24_ForkMainBranch.png) + +
+ +--- + +Once you have created the fork, you will see your copy of the forked repository under your own username. Seeing as you have just now forked the project, you will see the notification that you are up to date with the existing version of the CytometryInR course repository. + +As we go through the course, and new material is released each week on Sunday at 2200 EST (Monday 0300 GMT+0), you will see this changed to behind the main branch by a number of commits, and have the option to sync in the changes to your fork to gain access to that week's material. + +![](images/25_YourForkedBranch.png) + +
+ +--- + + +If you remember, previously under your GitHub profile, the Repositories tab only contained the repository corresponding to your ReadMe section. + +![](images/YourRepositories.png) + +
+ +--- + +You should however now be able to see your fork of the CytometryInR repository. As you add project specific repositories throughout the course, they will also appear here. + +![](images/YourUpdatedRepos.png) + +
+ +--- + +# Wrap-Up + +We have now completed our walk-through of setting up a GitHub account. At this point, you should have modified your GitHub profile, added a README section, and most importantly, forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. + +Next up, we will have you proceed to installing the required software to your computer that will be needed throughout the course. Installation instructions will vary depending on your computer's operating system, so please follow the appropiate walkthrough. + +# Additional Resources + +[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) + +[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) + +[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) + +[How to Use GitHub for Beginners](https://youtu.be/a9u2yZvsqHA?si=lbKBogzjEZ1YehpQ) + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_GitHub/slides.qmd b/course/00_GitHub/slides.qmd index 914fdf1..11561e1 100644 --- a/course/00_GitHub/slides.qmd +++ b/course/00_GitHub/slides.qmd @@ -1,594 +1,594 @@ ---- -title: "Using GitHub" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -# Background - -::: {.fragment} -::: {.callout-tip title="."} - -When working with code, it is very important to stay organized. You ultimately want to avoid being in a scenario where you need some code you wrote the previous month, and then having to search through multiple .R files, scattered across multiple folders, external hard-drives, and computers to find it. Likewise, you want to avoid ending up having identified multiple similarly-named copies of your original file that have all since diverged slightly from each other in some way that you have long since forgotten. - -::: -::: - ---- - -![](https://phdcomics.com/comics/archive/phd101212s.gif){width=50%} - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Ideally, everything needed for your coding script to successfully run should be kept within a project-specific folder. This ensures, that should you transfer it to another computer (whether your own or a colleagues) that you would still be able to recreate the scripts output. - -Likewise, if you make changes to your script, and your code stops working (no longer returns the expected output, ie. breaks), having a record of what changes were made since the last working version would be very helpful in pinpointing what went wrong. For beginners, this often ends up being a typo in a function name, or an accidentally misplaced comma somewhere in your document. - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -For these reasons, in this course, we will be extensively using the version control software [Git](https://git-scm.com/) from the very beginning. We will also have you create a [GitHub](https://github.com/) account, which will allow you to back-up your coding projects online as private repositories. Not only is this useful in case something happens to your computer, but it allows you to switch between separate computers while still having ready access to all your code, avoiding ending up with divergent copies on each computer. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Additionally, since all the material for this course is being hosted on a public GitHub repository, once you have set up your GitHub account you will be able to retrieve all the new materials and changes by simply refreshing (ie. syncing) your version of the course folder (ie. fork) once a week. Your GitHub account will also be needed when posting or asking questions on the [Discussion Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions). - -In this walk-through, we will go through setting up a GitHub account, and make sure you are familiar with some of the elements and locations that we will be circling back to throughout the course. - -::: -::: - ---- - -![](/images/Placeholder.png) - ---- - -# Getting Started - - -## Creating an Account - -::: {.fragment} -::: {.callout-tip title="."} -We will first navigate to the [GitHub homepage](). If you haven't previously created an account, click on the button to sign up for an account. -::: -::: - ---- - -![](images/01_GitHub.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the sign-up page, you will fill in various details needed to create an account. Please remember that GitHub usernames are visible to others. Additionally, if you end up sharing code with others as part of a manuscript, or use GitHub to create a personal portfolio website in the future, your username will appear as part of the URL. - -For example, in my case, my user name is DavidRach, so my GitHub profile ends up as: [https://github.com/DavidRach](https://github.com/DavidRach). For our course, the core's GitHub user name is UMGCCCFCSR, so the github profile ends up as [https://github.com/UMGCCCFCSR](https://github.com/UMGCCCFCSR), while the course website ends up as [https://umgcccfcsr.github.io/CytometryInR/](https://umgcccfcsr.github.io/CytometryInR/) -::: -::: - ---- - -![](images/02_GithubSignup.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once you have entered your new account information, you will need your account creation by entering the code sent to the email address that you provided. -::: -::: ---- - -![](images/03_Github2Factor.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once account creation has been confirmed, please proceed to login to GitHub for the first time. -::: -::: ---- - -![](images/04_Login.png) - ---- - -## GitHub Profile - -::: {.fragment} -::: {.callout-tip title="."} -Upon creating a brand new account, your GitHub homepage will initially look rather empty, and can be intimidating to navigate for the first time. - -For now, on the upper right, go ahead and click on the default profile picture icon... -::: -::: ---- - -![](images/05_YourIcon.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And then select Profile... -::: -::: ---- - -![](images/05_Profile.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You are now on your public GitHub profile page. For a newly created account, it will look something like this: -::: -::: ---- - -![](images/06_EditIcon.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For a more established account, this page will look a [little different](https://github.com/DrCytometer), and can be customized to highlight various projects that you are working on. - -For this course, we will have you set up a basic GitHub profile page for now, although you are free to customize and personalize it as much as you may want to in the future! - -To start, first select the edit profile button on the left below the default profile icon. -::: -::: ---- - -![](images/06_EditIcon.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You can then proceed to fill in any details that you feel are relevant and are comfortable sharing. -::: -::: ---- - -![](images/07_Basics.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With the quick access details filled in, it is now time to navigate to the Settings tab. You will return to the previous menu dropdown on the upper right, and instead of selecting Profile, click on the Settings option. -::: -::: ---- - -![](images/05_Profile.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You should now end up within your Public Profile Settings page. - -Feel free to edit the default profile picture, and any other fields that you feel are relevant. Once done, continue to scroll down the page past ORCID ID. -::: -::: ---- - -![](images/08_ProfileSetup.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When you reach Contributions and Activity, go ahead and select the option to include private repositories in the activity summary graphic. Then scroll down and click save. You will now be returned to your GitHub profile page. -::: -::: ---- - -![](images/09_SelectThisOneSuggested.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -At the top of the profile, you will see a "Your contributions" calendar graph. For a new account, it will look like this: -::: -::: ---- - -![](images/10_UpdatedGitHubProfile.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you are just starting out, this chart will be mostly empty, but will fill in as you work on projects, see [here](https://github.com/cararthompson) as an example. - -Every time you save your code (ie. make a commit), the activity will be reflected in this chart. By clicking the option in settings, code made within a private repository will remain private, but will count toward your contribution chart. As you progress through the course, this will provide a nice visual reminder of the progress you have made, and the obstacles that you have overcome. -::: -::: ---- - -![](images/10_UpdatedGitHubProfile.png) - ---- - -## GitHub ReadMe - -::: {.fragment} -::: {.callout-tip title="."} - -With this done, we modify your GitHub profile by adding one customized element, a ReadMe page. This will be used for a couple projects during the course, and can be personalized further in the future. - -To create a ReadMe page for your profile, we will navigate to the upper right of the screen and click on the + sign. - -::: -::: - ---- - -![](images/11_UpdatedGitHubProfile2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We will then select the Create New Repository option. - -::: -::: ---- - -![](images/12_NewRepository.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -You will next create a repository (folder), naming it exactly the same as your username. This will be recognized by GitHub as being a special type of repository corresponding to the ReadMe section of your profile. - -For options, leave the visibility as Public, and Add README set to On. And proceed to Create Repository. - -::: -::: ---- - -![](images/13_ReadMe.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Having created the repository (folder), you will see it has been populated by a few default files. For now, you will be editing the README.md file. On a new repository, the easiest way to access it is by clicking the green option on the right side of your screen. - -::: -::: ---- - -![](images/14_EditButton.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -With the README.md file now opened, you will be able to see generic filler text that is suggested by GitHub. - -For this course, I will ask you to add a couple elements for now. You are free to return and further personalize it later if you wish to do so. - -::: -::: ---- - -![](images/15_DefaultText.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The type of file that we are working with is a [Markdown](https://www.markdownguide.org/basic-syntax/) file, which can allow for a bunch of customizations which we will cover throughout the course. - -For now, please add and customize the following questions: - -Cytometry In R - -Location: Baltimore, Maryland, USA - -My Favorite Fluorophore/Metal-Isotope: Spark Blue 550 - -Previous Coding Experience: Repeatedly Calling IT - -What I Hope to Get From This Course: A faster way to match FlowSOM clusters to their likely cell type. - -::: -::: ---- - -![](images/16_ReadMeContent.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Next, to save you will select the green "Commit changes" button. We will cover the meaning of "Commit" more in-depth during the [Git](/course/00_Git/index.qmd) section. - -For now, write a short summary of the change you made to the file in the "Commit message", and any additional details within the "Extended description" field. When ready, click the green "Commit changes" button. - -::: -::: ---- - -![](images/17_ReadMeCommit.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -You will now be able to see the updated README.md file, as you can see in our example below. To make additional edits, you would select the pencil icon on the right-center side of the screen. - -::: -::: ---- - -![](images/18_ReadMeRendered.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Next, navigate back to your profile page (by clicking on either your username or the Overview option on the tabs). - -You will see that the README file contents are now displayed on the upper portion of your GitHub profile. Feel free to circle back and customize this further to your liking. - -In this last example, we created your first repository (folder). Since this is public, it is now shown below the README section of the profile under your repositories. You can also see that your commits made in the process of making the changes are now shown both in the Contributions graph, and under the Contributor Activity summary at the bottom of the page. - -::: -::: ---- - -![](images/19_UpdatedProfile.png) - ---- - -## GitHub Repository - -::: {.fragment} -::: {.callout-tip title="."} - -Having set up your GitHub profile, it now is time to make sure you have access to our course materials. We will have you navigate to our course's [GitHub profile](https://github.com/UMGCCCFCSR) - -On the profile page, you will be able to see our version of the README, our repositories, and the Contributions graph and Contribution activity sections. - -Please click on the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR) to navigate to its repository (folder) - -::: -::: ---- - -![](images/20_ToCourseProfile.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -On this page, you will see several elements that you will be circling back to throughout the course. - -For our course, we will be extentsively ussing the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page as a community forum. If you have any questions, are looking for feedback, or want to show off something that you worked on, this is the place for it. This will also help make sure - -::: -::: ---- - -![](images/21_Discussions.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) tab is where you will need to go to open an Issue if you encounter a bug (or major documentation typo), so that I can cicle back and correct them when I have the chance. - -::: -::: ---- - -![](images/21_BugReports.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To submit the optional take-home problems, you would turn in these problems by going to the [Pull Request](https://github.com/UMGCCCFCSR/CytometryInR/pulls) tab, and initiating a pull request between your forked version of the project and our "homework" branch (more details on this later). - -::: -::: ---- - -![](images/21_HomeworkPullRequest.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Optionally, you can "Star" a repository. This is basically the GitHub equivalent of liking a project. In our case, we will often star a repository since it will be saved under the Stars tab of our profile, which makes finding it again significantly easier a few weeks later after forgetting the repository name. - -::: -::: ---- - -![](images/21_Stars.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To see projects that you have starred, you can select the Stars option from the same dropdown you used to get to Settings. - -::: -::: ---- - -![](images/22_Stars.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Or from your GitHub profile, you can see these under [Stars](https://github.com/DavidRach?tab=stars) tab. - -::: -::: ---- - -![](images/22_YourStarredRepositories.png) - ---- - - -## Forking CytometryInR - -::: {.fragment} -::: {.callout-tip title="."} - -Before we go further, we will need you to make your own copy of the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/) (ie. fork it). This will allow you to quickly retrieve all the new materials and code corrections by simply rereshing (ie. syncing) your forked version with our upstream parent branch once a week. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To fork the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/), you will select the "Fork repository" option on the upper-center portion of your screen. - -::: -::: ---- - -![](images/23_ForkIt.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -By "Fork-ing" a repository, you are basically copying the contents from that repository to a newly created repository on your own GitHub. Forked projects are still linked to the original (parent) fork, and can retrieve any updates via syncing, as well as return changes via a pull request. - -For this course, when you create the fork, keep the existing repository name ("CytometryInR"). Importantly, select the copy main branch option. This will ensure you only get the code and data needed for the course copied over, and don't end up with your entire hard-drive filled will website elements, or other people's solutions to the take-home problems. - -::: -::: ---- - -![](images/24_ForkMainBranch.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Once you have created the fork, you will see your copy of the forked repository under your own username. Seeing as you have just now forked the project, you will see the notification that you are up to date with the existing version of the CytometryInR course repository. - -As we go through the course, and new material is released each week on Sunday at 2200 EST (Monday 0300 GMT+0), you will see this changed to behind the main branch by a number of commits, and have the option to sync in the changes to your fork to gain access to that week's material. - -::: -::: ---- - -![](images/25_YourForkedBranch.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you remember, previously under your GitHub profile, the Repositories tab only contained the repository corresponding to your ReadMe section. -::: -::: ---- - -![](images/YourRepositories.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You should however now be able to see your fork of the CytometryInR repository. As you add project specific repositories throughout the course, they will also appear here. -::: -::: ---- - -![](images/YourUpdatedRepos.png) - ---- - -# Wrap-Up - -::: {.fragment} -::: {.callout-tip title="."} -We have now completed our walk-through of setting up a GitHub account. At this point, you should have modified your GitHub profile, added a README section, and most importantly, forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. - -Next up, we will have you proceed to installing the required software to your computer that will be needed throughout the course. Installation instructions will vary depending on your computer's operating system, so please follow the appropiate walkthrough. -::: -::: - -# Additional Resources - -[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) - -[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) - -[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) - -[How to Use GitHub for Beginners](https://youtu.be/a9u2yZvsqHA?si=lbKBogzjEZ1YehpQ) - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using GitHub" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +# Background + +::: {.fragment} +::: {.callout-tip title="."} + +When working with code, it is very important to stay organized. You ultimately want to avoid being in a scenario where you need some code you wrote the previous month, and then having to search through multiple .R files, scattered across multiple folders, external hard-drives, and computers to find it. Likewise, you want to avoid ending up having identified multiple similarly-named copies of your original file that have all since diverged slightly from each other in some way that you have long since forgotten. + +::: +::: + +--- + +![](https://phdcomics.com/comics/archive/phd101212s.gif){width=50%} + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Ideally, everything needed for your coding script to successfully run should be kept within a project-specific folder. This ensures, that should you transfer it to another computer (whether your own or a colleagues) that you would still be able to recreate the scripts output. + +Likewise, if you make changes to your script, and your code stops working (no longer returns the expected output, ie. breaks), having a record of what changes were made since the last working version would be very helpful in pinpointing what went wrong. For beginners, this often ends up being a typo in a function name, or an accidentally misplaced comma somewhere in your document. + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +For these reasons, in this course, we will be extensively using the version control software [Git](https://git-scm.com/) from the very beginning. We will also have you create a [GitHub](https://github.com/) account, which will allow you to back-up your coding projects online as private repositories. Not only is this useful in case something happens to your computer, but it allows you to switch between separate computers while still having ready access to all your code, avoiding ending up with divergent copies on each computer. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Additionally, since all the material for this course is being hosted on a public GitHub repository, once you have set up your GitHub account you will be able to retrieve all the new materials and changes by simply refreshing (ie. syncing) your version of the course folder (ie. fork) once a week. Your GitHub account will also be needed when posting or asking questions on the [Discussion Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions). + +In this walk-through, we will go through setting up a GitHub account, and make sure you are familiar with some of the elements and locations that we will be circling back to throughout the course. + +::: +::: + +--- + +![](/images/Placeholder.png) + +--- + +# Getting Started + + +## Creating an Account + +::: {.fragment} +::: {.callout-tip title="."} +We will first navigate to the [GitHub homepage](). If you haven't previously created an account, click on the button to sign up for an account. +::: +::: + +--- + +![](images/01_GitHub.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the sign-up page, you will fill in various details needed to create an account. Please remember that GitHub usernames are visible to others. Additionally, if you end up sharing code with others as part of a manuscript, or use GitHub to create a personal portfolio website in the future, your username will appear as part of the URL. + +For example, in my case, my user name is DavidRach, so my GitHub profile ends up as: [https://github.com/DavidRach](https://github.com/DavidRach). For our course, the core's GitHub user name is UMGCCCFCSR, so the github profile ends up as [https://github.com/UMGCCCFCSR](https://github.com/UMGCCCFCSR), while the course website ends up as [https://umgcccfcsr.github.io/CytometryInR/](https://umgcccfcsr.github.io/CytometryInR/) +::: +::: + +--- + +![](images/02_GithubSignup.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once you have entered your new account information, you will need your account creation by entering the code sent to the email address that you provided. +::: +::: +--- + +![](images/03_Github2Factor.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once account creation has been confirmed, please proceed to login to GitHub for the first time. +::: +::: +--- + +![](images/04_Login.png) + +--- + +## GitHub Profile + +::: {.fragment} +::: {.callout-tip title="."} +Upon creating a brand new account, your GitHub homepage will initially look rather empty, and can be intimidating to navigate for the first time. + +For now, on the upper right, go ahead and click on the default profile picture icon... +::: +::: +--- + +![](images/05_YourIcon.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And then select Profile... +::: +::: +--- + +![](images/05_Profile.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You are now on your public GitHub profile page. For a newly created account, it will look something like this: +::: +::: +--- + +![](images/06_EditIcon.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For a more established account, this page will look a [little different](https://github.com/DrCytometer), and can be customized to highlight various projects that you are working on. + +For this course, we will have you set up a basic GitHub profile page for now, although you are free to customize and personalize it as much as you may want to in the future! + +To start, first select the edit profile button on the left below the default profile icon. +::: +::: +--- + +![](images/06_EditIcon.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You can then proceed to fill in any details that you feel are relevant and are comfortable sharing. +::: +::: +--- + +![](images/07_Basics.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the quick access details filled in, it is now time to navigate to the Settings tab. You will return to the previous menu dropdown on the upper right, and instead of selecting Profile, click on the Settings option. +::: +::: +--- + +![](images/05_Profile.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You should now end up within your Public Profile Settings page. + +Feel free to edit the default profile picture, and any other fields that you feel are relevant. Once done, continue to scroll down the page past ORCID ID. +::: +::: +--- + +![](images/08_ProfileSetup.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When you reach Contributions and Activity, go ahead and select the option to include private repositories in the activity summary graphic. Then scroll down and click save. You will now be returned to your GitHub profile page. +::: +::: +--- + +![](images/09_SelectThisOneSuggested.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +At the top of the profile, you will see a "Your contributions" calendar graph. For a new account, it will look like this: +::: +::: +--- + +![](images/10_UpdatedGitHubProfile.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you are just starting out, this chart will be mostly empty, but will fill in as you work on projects, see [here](https://github.com/cararthompson) as an example. + +Every time you save your code (ie. make a commit), the activity will be reflected in this chart. By clicking the option in settings, code made within a private repository will remain private, but will count toward your contribution chart. As you progress through the course, this will provide a nice visual reminder of the progress you have made, and the obstacles that you have overcome. +::: +::: +--- + +![](images/10_UpdatedGitHubProfile.png) + +--- + +## GitHub ReadMe + +::: {.fragment} +::: {.callout-tip title="."} + +With this done, we modify your GitHub profile by adding one customized element, a ReadMe page. This will be used for a couple projects during the course, and can be personalized further in the future. + +To create a ReadMe page for your profile, we will navigate to the upper right of the screen and click on the + sign. + +::: +::: + +--- + +![](images/11_UpdatedGitHubProfile2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We will then select the Create New Repository option. + +::: +::: +--- + +![](images/12_NewRepository.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +You will next create a repository (folder), naming it exactly the same as your username. This will be recognized by GitHub as being a special type of repository corresponding to the ReadMe section of your profile. + +For options, leave the visibility as Public, and Add README set to On. And proceed to Create Repository. + +::: +::: +--- + +![](images/13_ReadMe.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Having created the repository (folder), you will see it has been populated by a few default files. For now, you will be editing the README.md file. On a new repository, the easiest way to access it is by clicking the green option on the right side of your screen. + +::: +::: +--- + +![](images/14_EditButton.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +With the README.md file now opened, you will be able to see generic filler text that is suggested by GitHub. + +For this course, I will ask you to add a couple elements for now. You are free to return and further personalize it later if you wish to do so. + +::: +::: +--- + +![](images/15_DefaultText.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The type of file that we are working with is a [Markdown](https://www.markdownguide.org/basic-syntax/) file, which can allow for a bunch of customizations which we will cover throughout the course. + +For now, please add and customize the following questions: + +Cytometry In R + +Location: Baltimore, Maryland, USA + +My Favorite Fluorophore/Metal-Isotope: Spark Blue 550 + +Previous Coding Experience: Repeatedly Calling IT + +What I Hope to Get From This Course: A faster way to match FlowSOM clusters to their likely cell type. + +::: +::: +--- + +![](images/16_ReadMeContent.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Next, to save you will select the green "Commit changes" button. We will cover the meaning of "Commit" more in-depth during the [Git](/course/00_Git/index.qmd) section. + +For now, write a short summary of the change you made to the file in the "Commit message", and any additional details within the "Extended description" field. When ready, click the green "Commit changes" button. + +::: +::: +--- + +![](images/17_ReadMeCommit.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +You will now be able to see the updated README.md file, as you can see in our example below. To make additional edits, you would select the pencil icon on the right-center side of the screen. + +::: +::: +--- + +![](images/18_ReadMeRendered.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Next, navigate back to your profile page (by clicking on either your username or the Overview option on the tabs). + +You will see that the README file contents are now displayed on the upper portion of your GitHub profile. Feel free to circle back and customize this further to your liking. + +In this last example, we created your first repository (folder). Since this is public, it is now shown below the README section of the profile under your repositories. You can also see that your commits made in the process of making the changes are now shown both in the Contributions graph, and under the Contributor Activity summary at the bottom of the page. + +::: +::: +--- + +![](images/19_UpdatedProfile.png) + +--- + +## GitHub Repository + +::: {.fragment} +::: {.callout-tip title="."} + +Having set up your GitHub profile, it now is time to make sure you have access to our course materials. We will have you navigate to our course's [GitHub profile](https://github.com/UMGCCCFCSR) + +On the profile page, you will be able to see our version of the README, our repositories, and the Contributions graph and Contribution activity sections. + +Please click on the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR) to navigate to its repository (folder) + +::: +::: +--- + +![](images/20_ToCourseProfile.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +On this page, you will see several elements that you will be circling back to throughout the course. + +For our course, we will be extentsively ussing the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page as a community forum. If you have any questions, are looking for feedback, or want to show off something that you worked on, this is the place for it. This will also help make sure + +::: +::: +--- + +![](images/21_Discussions.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) tab is where you will need to go to open an Issue if you encounter a bug (or major documentation typo), so that I can cicle back and correct them when I have the chance. + +::: +::: +--- + +![](images/21_BugReports.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To submit the optional take-home problems, you would turn in these problems by going to the [Pull Request](https://github.com/UMGCCCFCSR/CytometryInR/pulls) tab, and initiating a pull request between your forked version of the project and our "homework" branch (more details on this later). + +::: +::: +--- + +![](images/21_HomeworkPullRequest.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Optionally, you can "Star" a repository. This is basically the GitHub equivalent of liking a project. In our case, we will often star a repository since it will be saved under the Stars tab of our profile, which makes finding it again significantly easier a few weeks later after forgetting the repository name. + +::: +::: +--- + +![](images/21_Stars.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To see projects that you have starred, you can select the Stars option from the same dropdown you used to get to Settings. + +::: +::: +--- + +![](images/22_Stars.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Or from your GitHub profile, you can see these under [Stars](https://github.com/DavidRach?tab=stars) tab. + +::: +::: +--- + +![](images/22_YourStarredRepositories.png) + +--- + + +## Forking CytometryInR + +::: {.fragment} +::: {.callout-tip title="."} + +Before we go further, we will need you to make your own copy of the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/) (ie. fork it). This will allow you to quickly retrieve all the new materials and code corrections by simply rereshing (ie. syncing) your forked version with our upstream parent branch once a week. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To fork the [course repository](https://github.com/UMGCCCFCSR/CytometryInR/), you will select the "Fork repository" option on the upper-center portion of your screen. + +::: +::: +--- + +![](images/23_ForkIt.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +By "Fork-ing" a repository, you are basically copying the contents from that repository to a newly created repository on your own GitHub. Forked projects are still linked to the original (parent) fork, and can retrieve any updates via syncing, as well as return changes via a pull request. + +For this course, when you create the fork, keep the existing repository name ("CytometryInR"). Importantly, select the copy main branch option. This will ensure you only get the code and data needed for the course copied over, and don't end up with your entire hard-drive filled will website elements, or other people's solutions to the take-home problems. + +::: +::: +--- + +![](images/24_ForkMainBranch.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Once you have created the fork, you will see your copy of the forked repository under your own username. Seeing as you have just now forked the project, you will see the notification that you are up to date with the existing version of the CytometryInR course repository. + +As we go through the course, and new material is released each week on Sunday at 2200 EST (Monday 0300 GMT+0), you will see this changed to behind the main branch by a number of commits, and have the option to sync in the changes to your fork to gain access to that week's material. + +::: +::: +--- + +![](images/25_YourForkedBranch.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you remember, previously under your GitHub profile, the Repositories tab only contained the repository corresponding to your ReadMe section. +::: +::: +--- + +![](images/YourRepositories.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You should however now be able to see your fork of the CytometryInR repository. As you add project specific repositories throughout the course, they will also appear here. +::: +::: +--- + +![](images/YourUpdatedRepos.png) + +--- + +# Wrap-Up + +::: {.fragment} +::: {.callout-tip title="."} +We have now completed our walk-through of setting up a GitHub account. At this point, you should have modified your GitHub profile, added a README section, and most importantly, forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. + +Next up, we will have you proceed to installing the required software to your computer that will be needed throughout the course. Installation instructions will vary depending on your computer's operating system, so please follow the appropiate walkthrough. +::: +::: + +# Additional Resources + +[Git & GitHub Tutorial for Scientist: It's Not Only for Programmers](https://gitbookdown.dallasdatascience.com/) + +[Ten Simple Rules for Taking Advantage of Git and GitHub](https://pmc.ncbi.nlm.nih.gov/articles/PMC4945047/) + +[A brief introduction to Git for beginers](https://youtu.be/r8jQ9hVA2qs?si=IYe7JghJpVTz9Ht4) + +[How to Use GitHub for Beginners](https://youtu.be/a9u2yZvsqHA?si=lbKBogzjEZ1YehpQ) + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Homeworks/index.qmd b/course/00_Homeworks/index.qmd index 4dae069..f017577 100644 --- a/course/00_Homeworks/index.qmd +++ b/course/00_Homeworks/index.qmd @@ -1,3 +1,405 @@ +<<<<<<< HEAD +--- +title: "Getting Help" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/QFaYpckzTEs?si=m9zEO9nPk6dvOL08) + + + +For screen-shot slides, click [here](/course/00_Homeworks/slides.qmd) + + +# Background + +In the previous sections, we set up our [GitHub](/course/00_GitHub/index.qmd) account, installed the required [software](/course/00_WorkstationSetup/index.qmd), and further explored various elements of [Positron](/course/00_Positron/index.qmd), [Git](/course/00_Git/index.qmd) and [Quarto](/course/00_Quarto/index.qmd) that we will be using throughout the course. + +This is our first year offering the course. Although we can and will answer questions during the livestreams, given the number of people signed up that might have a question, we want to make sure to provide multiple avenues by which you can get help and feedback throughout. These include the [Discussions Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions), where you can ask questions, discuss topics, get feedback and celebrate wins; and 2) turning in optional take-home problems via a pull request, in which the course instructors will take a look and provide additional feedback. + +In this walk-through, we go over how to use these resources. + +
+ +--- + +# Getting Started + + +## Discussions Forum + +On the course's [GitHub repository](https://github.com/UMGCCCFCSR/CytometryInR), we have opened up a [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page that we plan to use as a community forum. We hope that it will serve multiple functions, from providing a better sense of community for the online participants, to facilitating asking and receiving help on something that is not clear, provide feedback about something that it not working out, as well as a place to celebrate and show off your coding wins. + +![](images/Discussion.png) + +To keep the Discussions forum semi-organized, we have set up several categories, please select the appropiate category when opening a new discussion! + +
+ +--- + +### Code of Conduct + +![](images/CodeOfConduct.png) + +We ask that all course participants read and adhere to the spirit of our [Code of Conduct](https://github.com/UMGCCCFCSR/CytometryInR?tab=coc-ov-file). We are all human, at different points in our learning journeys, so what may be obvious to you at your point of your learning journey may have necessarily be obvious to someone just getting started. This course is our giving back to those in the community, but is on a voluntary basis in addition to our regular workload. While we try to reply quickly, sometimes our cell sorters fully melt down sending everything into chaos. We will reply when we can. + +
+ +--- + +### Announcements + +![](images/Announcements.png) + +When we send out an email to all participants, we will also repost it as an announcement. This ensures that even if you are not on our mailing list, you will still be able to have access to important information and course updates. + +
+ +--- + +![](images/000_Announcements.png) + +
+ +--- + +### General + +![](images/General.png) + +This section category can be used for any discussions that you think are worth having, that don't fall under any of the other category. Good examples are continuing a discussion that was held during one of the livestreams; wanting to discuss and dive further into a given week's topic; or bringing in additional resources that you found useful to understandingn something that didn't click initially. This space is for the community to shape as they see best. + + +
+ +--- + +![](images/000_General.png) + +
+ +--- + +### Ideas + +![](images/Ideas.png) + +Have an idea for a new topic or a way to improve the course? We would love to hear them. Provide as many details, and ideally, an example, and if it is doable, we will try to implement them. + +
+ +--- + +![](images/000_Ideas.png) + +
+ +--- + +### Introductions + +![](images/Introductions.png) + +Online courses can be odd in terms of replicating in-person dynamics. Fortunately, we have gathered the largest cohort of "cytometrist with no-to-little flow experience trying to learn R at the same time" that the world has ever seen, so best to take advantage of this while we can. Treat this section as if we had just met at a conference, tell us about yourself, what brings you here, and what you want to hopefully be able to do after the course ends. + +
+ +--- + +![](images/000_Introductions.png) + +
+ +--- + +## Polls + +![](images/Polls.png) + +Occasionally, we will need to gather community feedback on what is working and what is not working. We will sporadically post Polls for this purpose. + +
+ +--- + +![](images/000_Polls.png) + +
+ +--- + +### Q&A + +![](images/Q&A.png) + +The Questions and Answers (Q&A) section is where you go if something is not clear, not working, and you are trying to troubleshoot your way through it. First thing before posting, search! to see if someone has already asked the question. If you don't find anything, go ahead and open a new discussion. + +Since we are not at your computer, and don't have your dataset, when troubleshooting it is best to include a minimal reproducible example of the issuen you are encountering, slimming down the number of files needed to be transferred, and generalizing down the code so that other course participants and instructors can follow along. If this is not doable, or if the problem requires added context (and larger files), create a new repository on your GitHub, make it public, and share the links to it in your post. The goal would be to download the folder and be able to replicate the issue that you are encountering. + +
+ +--- + +![](images/000_QandA.png) + +
+ +--- + +![](images/000_QandAExample.png) + +
+ +--- + +### Show and Tell + +![](images/ShowAndTell.png) + +Where Q&A section is for getting help on code that is frustratingly not working, Show and Tell is where to go and celebrate when you finally get things to work. Share your wins, show us the extra pretty graphs, bizarre autofluorescence signatures, or odd outputs that just make you laugh. + +
+ +--- + +![](images/000_ShowAndTell.png) + +
+ +--- + +![](images/Timeline.png) + +
+ +--- + +## Issues + +Most of the time, if you are having trouble getting you code to run, you should first stop after some initial troubleshooting should be to open a new [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the Q&A category. Here you will be able to get both community and instructor help and suggestions to hopefully resolve whatever is going on. + +![](images/Issues.png) + +The Issues page is primarily meant for course-specific problems that require the course instructor intervention to fix. For example, we release a new week of material, and while it runs fine for both Windows and Linux, the code fails to run for all MacOS users. While you may be able to find workarounds on your own, it's ultimately our responsibility to help provide a solution so that everyone can move forward. This is the situation where opening an Issue is appropiate. + +
+ +--- + +![](images/000_IssuesExample.png) + + +Similarly, if our code contains a wrong argument, is returning a deprecation warning, etc. open an issue to let us know. While we may not be able to fix something that is not directly related to our code, we can redirect it to the package maintainers so that they can fix the issue. + +And likewise, if you find multiple typos in the documentation, you can open an issue and propose carrying out a pull-request to fix them. + + +
+ +--- + +## Submitting Take-Home Problems + +Each week, during the course, we introduce and cover the main concepts for the particular concept. Our goal is to provide you with the necessary code and enough code to be able to get the jist. However, to become comfortable and be able to apply what you have learned, you will need to explore beyond our examples, try it with your own datasets, encounter things that don't work, and troubleshoot your way through them. It's this cycle of venturing into the unknown that develops strong coding skills that are needed to overcome any barrier you encounter. The goal of the take-home questions is to provide some less curated problems that will take a little longer to answer to help get you started on your own exploration of the topic. + +As previously mentioned, these take-home problems are completely **optional**. If you are in the middle of solving them and want to seek feedback from then community and course instructors, open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the general category is the way to go. + +However, if you have completed them, and want course instructor feedback, you can submit them to us in the form of a pull-request to the CytometryInR repo's homework branch. We will take a look, offer constructive suggestions, and when ready merge the solution. This will also result in GitHub listing you as a contributor to the course. + +We will outline the basic steps of how to set up and open a pull-request, to help simplify the process. + +### Sync your Fork + +First off, make sure to Sync your fork of the Cytometry in R project. That makes sure that all the commits present are up-to-date and simplifies the process of having the pull-request being merged. + + +![](images/00_Sync.png) + +
+ +--- + +![](images/00_Compare.png) + +
+ +--- + +![](images/02_Synced.png) + +
+ +--- + +### Pull to Local + +Having Synced your branch on GitHub, return to your computer, open the CytometryInR repository and [pull](/course/00_Git/index.qmd#pull) in the changes locally. + +
+ +--- + +### Create own Folder under Homeworks + +Under the course folder, you will find folders for each week. Within these folders find the homework folder. This will appear empty except for a README file with ionstructions. It is within this folder you will need to create your own folder. + +To ensure there are no conflicts on the pull-request merge, please use your GitHub username as the folder name. + +![](images/09_Homework.png) + +
+ +--- + +Once you have your folder inside homework, go ahead and copy anything you are turning in from their respective working project folders. Remember, the goal is minimal reproducible example is the goal. Rendered Quarto Documents are preferred, but we will also accept scripts and small data files and images. a README.MD file with anything you want me to know, + +![](images/10_TakeHomeReturnStructure.png) + +
+ +--- + + +![](images/11_SelfContained.png) + + +
+ +--- + +### Sign off Commit + +Now that everything is present, Sign Off and Commit the change. + +![](images/12_Commit.png) + +
+ +--- + +### Push Branch to GitHub. + +Proceed to push the branch to GitHub. + +![](images/13_Sync.png) + +
+ +--- + +# Re-sync if necessary + +If additional changes have occured to the parent CytometryInR repository, go ahead and update your branch. As long as your edits occurred within your folder inside homework folders, they should still be able to merge. + +![](images/17_SyncMaybe.png) + +
+ +--- + +![](images/18_Update.png) + +
+ +--- + +### Open a pull-request + +To start a pull request, click to see how your commit is ahead by + +![](images/14_Ahead.png) + +
+ +--- + +Next, switch from the parent CytometryInR main branch (used for the website and course) to the homework branch for that respective week (used for the take-home problems). + +![](images/15_BranchSwitch.png) + +
+ +--- + +Once this is done, select Pull request + +![](images/16_PullRequest.png) + +
+ +--- + +Make sure to triple check it's bound for the homeworks branch. If you see that it is not capable of merging, verify that your commit only contains files within your respective homework username folder. Fill in the required fields of the pull request. + +![](images/20_PullRequestHomeworks.png) + +
+ +--- + +And when ready, create the pull request. + +
+ +--- + +### Wait for Feedback + +On our end, once you have created a pull request, we will review your work, offer constructive suggestions, etc. If I ask for revisions, all you would need to do is update your files, commit again on your side of the local forked repository. + +![](images/22_StartReviewProcess.png) + +
+ +--- + +### Final Review and Merge + +If all is good, we will merge the pull request and your solution to the take-home problems will now be available on the homework branch. + +![](images/23_Merge.png) + +
+ +--- + +### After course + +After the course completes, we will merge homework branch with the main branch, making the community solutions to the take-home problems additional coding examples that can be used by others following along after the course concludes. + +
+ +--- + +# Wrap-up + +In this walk-through, we covered the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) Forum, mentioned appropiate use cases for the [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) page and provided the logistics of how to submit take-home problems as a pull request to the homework branch. We have now covered all the major elements that you will be using throughout the course. + +The next couple sections cover our thoughts [on AI use]() in a course for coding beginners, and an optional walkthrough of how to use [Floreada](/course/00_Floreada/index.qmd) in preparation for some topics starting around Week 5. + + +# Additional Resources + +[Create a Home for Your Community With GitHub Discussions](https://github.blog/open-source/maintainers/create-a-home-for-your-community-with-github-discussions/) + +[GitHub for Beginners: How to create a pull request in 4 minutes](https://youtu.be/nCKdihvneS0?si=PaM7QmylZiGfU9v4) + +[Five tips for Reviewing a GitHub pull request](https://www.youtube.com/watch?v=nP9Y72HQNaA) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +======= --- title: "Getting Help" author: "David Rach" @@ -398,4 +800,5 @@ The next couple sections cover our thoughts [on AI use]() in a course for coding ::: {style="text-align: right;"} [![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +>>>>>>> 23a81a59a64966e782d820f6b60f087d577c3b25 ::: \ No newline at end of file diff --git a/course/00_Homeworks/slides.qmd b/course/00_Homeworks/slides.qmd index 22e913b..231d3a8 100644 --- a/course/00_Homeworks/slides.qmd +++ b/course/00_Homeworks/slides.qmd @@ -1,539 +1,539 @@ ---- -title: "Getting Help" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - ---- - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -In the previous sections, we set up our [GitHub](/course/00_GitHub/index.qmd) account, installed the required [software](/course/00_WorkstationSetup/index.qmd), and further explored various elements of [Positron](/course/00_Positron/index.qmd), [Git](/course/00_Git/index.qmd) and [Quarto](/course/00_Quarto/index.qmd) that we will be using throughout the course. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This is our first year offering the course. Although we can and will answer questions during the livestreams, given the number of people signed up that might have a question, we want to make sure to provide multiple avenues by which you can get help and feedback throughout. These include the [Discussions Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions), where you can ask questions, discuss topics, get feedback and celebrate wins; and 2) turning in optional take-home problems via a pull request, in which the course instructors will take a look and provide additional feedback. - -In this walk-through, we go over how to use these resources. -::: -::: - ---- - -# Getting Started - - -## Discussions Forum - - -::: {.fragment} -::: {.callout-tip title="."} -On the course's [GitHub repository](https://github.com/UMGCCCFCSR/CytometryInR), we have opened up a [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page that we plan to use as a community forum. We hope that it will serve multiple functions, from providing a better sense of community for the online participants, to facilitating asking and receiving help on something that is not clear, provide feedback about something that it not working out, as well as a place to celebrate and show off your coding wins. -::: -::: - ---- - -![](images/Discussion.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To keep the Discussions forum semi-organized, we have set up several categories, please select the appropiate category when opening a new discussion! -::: -::: - ---- - -### Code of Conduct - -::: {.fragment} -::: {.callout-tip title="."} -We ask that all course participants read and adhere to the spirit of our [Code of Conduct](https://github.com/UMGCCCFCSR/CytometryInR?tab=coc-ov-file). We are all human, at different points in our learning journeys, so what may be obvious to you at your point of your learning journey may have necessarily be obvious to someone just getting started. This course is our giving back to those in the community, but is on a voluntary basis in addition to our regular workload. While we try to reply quickly, sometimes our cell sorters fully melt down sending everything into chaos. We will reply when we can. -::: -::: - ---- - -![](images/CodeOfConduct.png) - ---- - -### Announcements - -![](images/Announcements.png) - -::: {.fragment} -::: {.callout-tip title="."} -When we send out an email to all participants, we will also repost it as an announcement. This ensures that even if you are not on our mailing list, you will still be able to have access to important information and course updates. -::: -::: - ---- - -![](images/000_Announcements.png) - ---- - -### General - -![](images/General.png) - -::: {.fragment} -::: {.callout-tip title="."} -This section category can be used for any discussions that you think are worth having, that don't fall under any of the other category. Good examples are continuing a discussion that was held during one of the livestreams; wanting to discuss and dive further into a given week's topic; or bringing in additional resources that you found useful to understandingn something that didn't click initially. This space is for the community to shape as they see best. -::: -::: - ---- - -![](images/000_General.png) - ---- - -### Ideas - -![](images/Ideas.png) - -::: {.fragment} -::: {.callout-tip title="."} -Have an idea for a new topic or a way to improve the course? We would love to hear them. Provide as many details, and ideally, an example, and if it is doable, we will try to implement them. -::: -::: - ---- - -![](images/000_Ideas.png) - ---- - -### Introductions - -![](images/Introductions.png) - -::: {.fragment} -::: {.callout-tip title="."} -Online courses can be odd in terms of replicating in-person dynamics. Fortunately, we have gathered the largest cohort of "cytometrist with no-to-little flow experience trying to learn R at the same time" that the world has ever seen, so best to take advantage of this while we can. Treat this section as if we had just met at a conference, tell us about yourself, what brings you here, and what you want to hopefully be able to do after the course ends. -::: -::: - ---- - -![](images/000_Introductions.png) - ---- - -## Polls - -![](images/Polls.png) - -::: {.fragment} -::: {.callout-tip title="."} -Occasionally, we will need to gather community feedback on what is working and what is not working. We will sporadically post Polls for this purpose. -::: -::: - ---- - -![](images/000_Polls.png) - ---- - -### Q&A - -![](images/Q&A.png) - -::: {.fragment} -::: {.callout-tip title="."} -The Questions and Answers (Q&A) section is where you go if something is not clear, not working, and you are trying to troubleshoot your way through it. First thing before posting, search! to see if someone has already asked the question. If you don't find anything, go ahead and open a new discussion. -::: -::: - ---- - -![](images/000_QandA.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Since we are not at your computer, and don't have your dataset, when troubleshooting it is best to include a minimal reproducible example of the issuen you are encountering, slimming down the number of files needed to be transferred, and generalizing down the code so that other course participants and instructors can follow along. If this is not doable, or if the problem requires added context (and larger files), create a new repository on your GitHub, make it public, and share the links to it in your post. The goal would be to download the folder and be able to replicate the issue that you are encountering. -::: -::: - ---- - -![](images/000_QandAExample.png) - ---- - -### Show and Tell - -![](images/ShowAndTell.png) - -::: {.fragment} -::: {.callout-tip title="."} -Where Q&A section is for getting help on code that is frustratingly not working, Show and Tell is where to go and celebrate when you finally get things to work. Share your wins, show us the extra pretty graphs, bizarre autofluorescence signatures, or odd outputs that just make you laugh. -::: -::: - ---- - -![](images/000_ShowAndTell.png) - ---- - -![](images/Timeline.png) - ---- - -## Issues - -![](images/Issues.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Most of the time, if you are having trouble getting you code to run, you should first stop after some initial troubleshooting should be to open a new [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the Q&A category. Here you will be able to get both community and instructor help and suggestions to hopefully resolve whatever is going on. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The Issues page is primarily meant for course-specific problems that require the course instructor intervention to fix. For example, we release a new week of material, and while it runs fine for both Windows and Linux, the code fails to run for all MacOS users. While you may be able to find workarounds on your own, it's ultimately our responsibility to help provide a solution so that everyone can move forward. This is the situation where opening an Issue is appropiate. -::: -::: - ---- - -![](images/000_IssuesExample.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similarly, if our code contains a wrong argument, is returning a deprecation warning, etc. open an issue to let us know. While we may not be able to fix something that is not directly related to our code, we can redirect it to the package maintainers so that they can fix the issue. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And likewise, if you find multiple typos in the documentation, you can open an issue and propose carrying out a pull-request to fix them. -::: -::: - ---- - -## Submitting Take-Home Problems - - -::: {.fragment} -::: {.callout-tip title="."} -Each week, during the course, we introduce and cover the main concepts for the particular concept. Our goal is to provide you with the necessary code and enough code to be able to get the jist. However, to become comfortable and be able to apply what you have learned, you will need to explore beyond our examples, try it with your own datasets, encounter things that don't work, and troubleshoot your way through them. It's this cycle of venturing into the unknown that develops strong coding skills that are needed to overcome any barrier you encounter. The goal of the take-home questions is to provide some less curated problems that will take a little longer to answer to help get you started on your own exploration of the topic. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As previously mentioned, these take-home problems are completely **optional**. If you are in the middle of solving them and want to seek feedback from then community and course instructors, open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the general category is the way to go. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -However, if you have completed them, and want course instructor feedback, you can submit them to us in the form of a pull-request to the CytometryInR repo's homework branch. We will take a look, offer constructive suggestions, and when ready merge the solution. This will also result in GitHub listing you as a contributor to the course. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will outline the basic steps of how to set up and open a pull-request, to help simplify the process. -::: -::: - ---- - -### Sync your Fork - - -::: {.fragment} -::: {.callout-tip title="."} -First off, make sure to Sync your fork of the Cytometry in R project. That makes sure that all the commits present are up-to-date and simplifies the process of having the pull-request being merged. -::: -::: - ---- - -![](images/00_Sync.png) - - ---- - -![](images/00_Compare.png) - - ---- - -![](images/02_Synced.png) - - ---- - -### Pull to Local - -::: {.fragment} -::: {.callout-tip title="."} -Having Synced your branch on GitHub, return to your computer, open the CytometryInR repository and [pull](/course/00_Git/index.qmd#pull) in the changes locally. -::: -::: - ---- - -### Create own Folder under Homeworks - - -::: {.fragment} -::: {.callout-tip title="."} -Under the course folder, you will find folders for each week. Within these folders find the homework folder. This will appear empty except for a README file with ionstructions. It is within this folder you will need to create your own folder. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To ensure there are no conflicts on the pull-request merge, please use your GitHub username as the folder name. -::: -::: - ---- - -![](images/09_Homework.png) - ---- - - -::: {.fragment} -::: {.callout-tip title="."} -Once you have your folder inside homework, go ahead and copy anything you are turning in from their respective working project folders. Remember, the goal is minimal reproducible example is the goal. Rendered Quarto Documents are preferred, but we will also accept scripts and small data files and images. a README.MD file with anything you want me to know, -::: -::: - ---- - -![](images/10_TakeHomeReturnStructure.png) - ---- - -![](images/11_SelfContained.png) - ---- - -### Sign off Commit - - -::: {.fragment} -::: {.callout-tip title="."} -Now that everything is present, Sign Off and Commit the change. -::: -::: - ---- - -![](images/12_Commit.png) - ---- - -### Push Branch to GitHub. - -::: {.fragment} -::: {.callout-tip title="."} -Proceed to push the branch to GitHub. -::: -::: - ---- - -![](images/13_Sync.png) - ---- - -# Re-sync if necessary - - -::: {.fragment} -::: {.callout-tip title="."} -If additional changes have occured to the parent CytometryInR repository, go ahead and update your branch. As long as your edits occurred within your folder inside homework folders, they should still be able to merge. -::: -::: - ---- - -![](images/17_SyncMaybe.png) - ---- - -![](images/18_Update.png) - ---- - -### Open a pull-request - - -::: {.fragment} -::: {.callout-tip title="."} -To start a pull request, click to see how your commit is ahead by -::: -::: - ---- - -![](images/14_Ahead.png) - ---- - - -::: {.fragment} -::: {.callout-tip title="."} -Next, switch from the parent CytometryInR main branch (used for the website and course) to the homework branch for that respective week (used for the take-home problems). -::: -::: - ---- - -![](images/15_BranchSwitch.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, select Pull request -::: -::: - ---- - -![](images/16_PullRequest.png) - ---- - - -::: {.fragment} -::: {.callout-tip title="."} -Make sure to triple check it's bound for the homeworks branch. If you see that it is not capable of merging, verify that your commit only contains files within your respective homework username folder. Fill in the required fields of the pull request. -::: -::: - ---- - -![](images/20_PullRequestHomeworks.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And when ready, create the pull request. -::: -::: - ---- - -### Wait for Feedback - -::: {.fragment} -::: {.callout-tip title="."} -On our end, once you have created a pull request, we will review your work, offer constructive suggestions, etc. If I ask for revisions, all you would need to do is update your files, commit again on your side of the local forked repository. -::: -::: - ---- - -![](images/22_StartReviewProcess.png) - ---- - -### Final Review and Merge - -::: {.fragment} -::: {.callout-tip title="."} -If all is good, we will merge the pull request and your solution to the take-home problems will now be available on the homework branch. -::: -::: - ---- - -![](images/23_Merge.png) - ---- - -### After course - -::: {.fragment} -::: {.callout-tip title="."} -After the course completes, we will merge homework branch with the main branch, making the community solutions to the take-home problems additional coding examples that can be used by others following along after the course concludes. -::: -::: - ---- - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -In this walk-through, we covered the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) Forum, mentioned appropiate use cases for the [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) page and provided the logistics of how to submit take-home problems as a pull request to the homework branch. We have now covered all the major elements that you will be using throughout the course. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The next couple sections cover our thoughts [on AI use]() in a course for coding beginners, and an optional walkthrough of how to use [Floreada](/course/00_Floreada/index.qmd) in preparation for some topics starting around Week 5. -::: -::: - -# Additional Resources - -[Create a Home for Your Community With GitHub Discussions](https://github.blog/open-source/maintainers/create-a-home-for-your-community-with-github-discussions/) - -[GitHub for Beginners: How to create a pull request in 4 minutes](https://youtu.be/nCKdihvneS0?si=PaM7QmylZiGfU9v4) - -[Five tips for Reviewing a GitHub pull request](https://www.youtube.com/watch?v=nP9Y72HQNaA) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Getting Help" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +--- + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +In the previous sections, we set up our [GitHub](/course/00_GitHub/index.qmd) account, installed the required [software](/course/00_WorkstationSetup/index.qmd), and further explored various elements of [Positron](/course/00_Positron/index.qmd), [Git](/course/00_Git/index.qmd) and [Quarto](/course/00_Quarto/index.qmd) that we will be using throughout the course. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is our first year offering the course. Although we can and will answer questions during the livestreams, given the number of people signed up that might have a question, we want to make sure to provide multiple avenues by which you can get help and feedback throughout. These include the [Discussions Forum](https://github.com/UMGCCCFCSR/CytometryInR/discussions), where you can ask questions, discuss topics, get feedback and celebrate wins; and 2) turning in optional take-home problems via a pull request, in which the course instructors will take a look and provide additional feedback. + +In this walk-through, we go over how to use these resources. +::: +::: + +--- + +# Getting Started + + +## Discussions Forum + + +::: {.fragment} +::: {.callout-tip title="."} +On the course's [GitHub repository](https://github.com/UMGCCCFCSR/CytometryInR), we have opened up a [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page that we plan to use as a community forum. We hope that it will serve multiple functions, from providing a better sense of community for the online participants, to facilitating asking and receiving help on something that is not clear, provide feedback about something that it not working out, as well as a place to celebrate and show off your coding wins. +::: +::: + +--- + +![](images/Discussion.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To keep the Discussions forum semi-organized, we have set up several categories, please select the appropiate category when opening a new discussion! +::: +::: + +--- + +### Code of Conduct + +::: {.fragment} +::: {.callout-tip title="."} +We ask that all course participants read and adhere to the spirit of our [Code of Conduct](https://github.com/UMGCCCFCSR/CytometryInR?tab=coc-ov-file). We are all human, at different points in our learning journeys, so what may be obvious to you at your point of your learning journey may have necessarily be obvious to someone just getting started. This course is our giving back to those in the community, but is on a voluntary basis in addition to our regular workload. While we try to reply quickly, sometimes our cell sorters fully melt down sending everything into chaos. We will reply when we can. +::: +::: + +--- + +![](images/CodeOfConduct.png) + +--- + +### Announcements + +![](images/Announcements.png) + +::: {.fragment} +::: {.callout-tip title="."} +When we send out an email to all participants, we will also repost it as an announcement. This ensures that even if you are not on our mailing list, you will still be able to have access to important information and course updates. +::: +::: + +--- + +![](images/000_Announcements.png) + +--- + +### General + +![](images/General.png) + +::: {.fragment} +::: {.callout-tip title="."} +This section category can be used for any discussions that you think are worth having, that don't fall under any of the other category. Good examples are continuing a discussion that was held during one of the livestreams; wanting to discuss and dive further into a given week's topic; or bringing in additional resources that you found useful to understandingn something that didn't click initially. This space is for the community to shape as they see best. +::: +::: + +--- + +![](images/000_General.png) + +--- + +### Ideas + +![](images/Ideas.png) + +::: {.fragment} +::: {.callout-tip title="."} +Have an idea for a new topic or a way to improve the course? We would love to hear them. Provide as many details, and ideally, an example, and if it is doable, we will try to implement them. +::: +::: + +--- + +![](images/000_Ideas.png) + +--- + +### Introductions + +![](images/Introductions.png) + +::: {.fragment} +::: {.callout-tip title="."} +Online courses can be odd in terms of replicating in-person dynamics. Fortunately, we have gathered the largest cohort of "cytometrist with no-to-little flow experience trying to learn R at the same time" that the world has ever seen, so best to take advantage of this while we can. Treat this section as if we had just met at a conference, tell us about yourself, what brings you here, and what you want to hopefully be able to do after the course ends. +::: +::: + +--- + +![](images/000_Introductions.png) + +--- + +## Polls + +![](images/Polls.png) + +::: {.fragment} +::: {.callout-tip title="."} +Occasionally, we will need to gather community feedback on what is working and what is not working. We will sporadically post Polls for this purpose. +::: +::: + +--- + +![](images/000_Polls.png) + +--- + +### Q&A + +![](images/Q&A.png) + +::: {.fragment} +::: {.callout-tip title="."} +The Questions and Answers (Q&A) section is where you go if something is not clear, not working, and you are trying to troubleshoot your way through it. First thing before posting, search! to see if someone has already asked the question. If you don't find anything, go ahead and open a new discussion. +::: +::: + +--- + +![](images/000_QandA.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Since we are not at your computer, and don't have your dataset, when troubleshooting it is best to include a minimal reproducible example of the issuen you are encountering, slimming down the number of files needed to be transferred, and generalizing down the code so that other course participants and instructors can follow along. If this is not doable, or if the problem requires added context (and larger files), create a new repository on your GitHub, make it public, and share the links to it in your post. The goal would be to download the folder and be able to replicate the issue that you are encountering. +::: +::: + +--- + +![](images/000_QandAExample.png) + +--- + +### Show and Tell + +![](images/ShowAndTell.png) + +::: {.fragment} +::: {.callout-tip title="."} +Where Q&A section is for getting help on code that is frustratingly not working, Show and Tell is where to go and celebrate when you finally get things to work. Share your wins, show us the extra pretty graphs, bizarre autofluorescence signatures, or odd outputs that just make you laugh. +::: +::: + +--- + +![](images/000_ShowAndTell.png) + +--- + +![](images/Timeline.png) + +--- + +## Issues + +![](images/Issues.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Most of the time, if you are having trouble getting you code to run, you should first stop after some initial troubleshooting should be to open a new [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the Q&A category. Here you will be able to get both community and instructor help and suggestions to hopefully resolve whatever is going on. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The Issues page is primarily meant for course-specific problems that require the course instructor intervention to fix. For example, we release a new week of material, and while it runs fine for both Windows and Linux, the code fails to run for all MacOS users. While you may be able to find workarounds on your own, it's ultimately our responsibility to help provide a solution so that everyone can move forward. This is the situation where opening an Issue is appropiate. +::: +::: + +--- + +![](images/000_IssuesExample.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similarly, if our code contains a wrong argument, is returning a deprecation warning, etc. open an issue to let us know. While we may not be able to fix something that is not directly related to our code, we can redirect it to the package maintainers so that they can fix the issue. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And likewise, if you find multiple typos in the documentation, you can open an issue and propose carrying out a pull-request to fix them. +::: +::: + +--- + +## Submitting Take-Home Problems + + +::: {.fragment} +::: {.callout-tip title="."} +Each week, during the course, we introduce and cover the main concepts for the particular concept. Our goal is to provide you with the necessary code and enough code to be able to get the jist. However, to become comfortable and be able to apply what you have learned, you will need to explore beyond our examples, try it with your own datasets, encounter things that don't work, and troubleshoot your way through them. It's this cycle of venturing into the unknown that develops strong coding skills that are needed to overcome any barrier you encounter. The goal of the take-home questions is to provide some less curated problems that will take a little longer to answer to help get you started on your own exploration of the topic. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As previously mentioned, these take-home problems are completely **optional**. If you are in the middle of solving them and want to seek feedback from then community and course instructors, open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) under the general category is the way to go. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +However, if you have completed them, and want course instructor feedback, you can submit them to us in the form of a pull-request to the CytometryInR repo's homework branch. We will take a look, offer constructive suggestions, and when ready merge the solution. This will also result in GitHub listing you as a contributor to the course. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will outline the basic steps of how to set up and open a pull-request, to help simplify the process. +::: +::: + +--- + +### Sync your Fork + + +::: {.fragment} +::: {.callout-tip title="."} +First off, make sure to Sync your fork of the Cytometry in R project. That makes sure that all the commits present are up-to-date and simplifies the process of having the pull-request being merged. +::: +::: + +--- + +![](images/00_Sync.png) + + +--- + +![](images/00_Compare.png) + + +--- + +![](images/02_Synced.png) + + +--- + +### Pull to Local + +::: {.fragment} +::: {.callout-tip title="."} +Having Synced your branch on GitHub, return to your computer, open the CytometryInR repository and [pull](/course/00_Git/index.qmd#pull) in the changes locally. +::: +::: + +--- + +### Create own Folder under Homeworks + + +::: {.fragment} +::: {.callout-tip title="."} +Under the course folder, you will find folders for each week. Within these folders find the homework folder. This will appear empty except for a README file with ionstructions. It is within this folder you will need to create your own folder. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To ensure there are no conflicts on the pull-request merge, please use your GitHub username as the folder name. +::: +::: + +--- + +![](images/09_Homework.png) + +--- + + +::: {.fragment} +::: {.callout-tip title="."} +Once you have your folder inside homework, go ahead and copy anything you are turning in from their respective working project folders. Remember, the goal is minimal reproducible example is the goal. Rendered Quarto Documents are preferred, but we will also accept scripts and small data files and images. a README.MD file with anything you want me to know, +::: +::: + +--- + +![](images/10_TakeHomeReturnStructure.png) + +--- + +![](images/11_SelfContained.png) + +--- + +### Sign off Commit + + +::: {.fragment} +::: {.callout-tip title="."} +Now that everything is present, Sign Off and Commit the change. +::: +::: + +--- + +![](images/12_Commit.png) + +--- + +### Push Branch to GitHub. + +::: {.fragment} +::: {.callout-tip title="."} +Proceed to push the branch to GitHub. +::: +::: + +--- + +![](images/13_Sync.png) + +--- + +# Re-sync if necessary + + +::: {.fragment} +::: {.callout-tip title="."} +If additional changes have occured to the parent CytometryInR repository, go ahead and update your branch. As long as your edits occurred within your folder inside homework folders, they should still be able to merge. +::: +::: + +--- + +![](images/17_SyncMaybe.png) + +--- + +![](images/18_Update.png) + +--- + +### Open a pull-request + + +::: {.fragment} +::: {.callout-tip title="."} +To start a pull request, click to see how your commit is ahead by +::: +::: + +--- + +![](images/14_Ahead.png) + +--- + + +::: {.fragment} +::: {.callout-tip title="."} +Next, switch from the parent CytometryInR main branch (used for the website and course) to the homework branch for that respective week (used for the take-home problems). +::: +::: + +--- + +![](images/15_BranchSwitch.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, select Pull request +::: +::: + +--- + +![](images/16_PullRequest.png) + +--- + + +::: {.fragment} +::: {.callout-tip title="."} +Make sure to triple check it's bound for the homeworks branch. If you see that it is not capable of merging, verify that your commit only contains files within your respective homework username folder. Fill in the required fields of the pull request. +::: +::: + +--- + +![](images/20_PullRequestHomeworks.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And when ready, create the pull request. +::: +::: + +--- + +### Wait for Feedback + +::: {.fragment} +::: {.callout-tip title="."} +On our end, once you have created a pull request, we will review your work, offer constructive suggestions, etc. If I ask for revisions, all you would need to do is update your files, commit again on your side of the local forked repository. +::: +::: + +--- + +![](images/22_StartReviewProcess.png) + +--- + +### Final Review and Merge + +::: {.fragment} +::: {.callout-tip title="."} +If all is good, we will merge the pull request and your solution to the take-home problems will now be available on the homework branch. +::: +::: + +--- + +![](images/23_Merge.png) + +--- + +### After course + +::: {.fragment} +::: {.callout-tip title="."} +After the course completes, we will merge homework branch with the main branch, making the community solutions to the take-home problems additional coding examples that can be used by others following along after the course concludes. +::: +::: + +--- + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +In this walk-through, we covered the [Discussions](https://github.com/UMGCCCFCSR/CytometryInR/discussions) Forum, mentioned appropiate use cases for the [Issues](https://github.com/UMGCCCFCSR/CytometryInR/issues) page and provided the logistics of how to submit take-home problems as a pull request to the homework branch. We have now covered all the major elements that you will be using throughout the course. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The next couple sections cover our thoughts [on AI use]() in a course for coding beginners, and an optional walkthrough of how to use [Floreada](/course/00_Floreada/index.qmd) in preparation for some topics starting around Week 5. +::: +::: + +# Additional Resources + +[Create a Home for Your Community With GitHub Discussions](https://github.blog/open-source/maintainers/create-a-home-for-your-community-with-github-discussions/) + +[GitHub for Beginners: How to create a pull request in 4 minutes](https://youtu.be/nCKdihvneS0?si=PaM7QmylZiGfU9v4) + +[Five tips for Reviewing a GitHub pull request](https://www.youtube.com/watch?v=nP9Y72HQNaA) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Positron/index.qmd b/course/00_Positron/index.qmd index 6827205..47108dd 100644 --- a/course/00_Positron/index.qmd +++ b/course/00_Positron/index.qmd @@ -1,350 +1,350 @@ ---- -title: "Using Positron" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/FSXsgaeM9Xo?si=kUZx9tn3KByDniEv) - - - -For screen-shot slides, click [here](/course/00_Positron/slides.qmd) - -# Background - -In this course, we are creating and working with code from the programming language [R](https://www.r-project.org/). However, in practice, we are not running the code directly using just the base R software. Typically, we are running an integrated development environment (IDE), which is an additional software running on top of base R. - -An IDE has the responsibility to help organize and manage the projects folders, pass along lines of code being executed (run) to the underlying R software, and then return and visualize the outputs in a manner that leads to increased producitivity. Examples of IDEs include [Positron](https://positron.posit.co/), [Visual Studio Code](https://code.visualstudio.com/) and [Rstudio](https://posit.co/downloads/). - -For this course, we will be using [Positron](https://positron.posit.co/) as our primary IDE. For those of you who have previous R experience, you are likely more familiar with [Rstudio](https://posit.co/downloads/) which is also made by Posit, and is the older of the two IDEs. Why use Positron for this course then? - -There are several reasons. First, Positron combines the best elements of both Rstudio (which preceeded it) and VS code (from which it's base infrastructure was [forked](https://posit.co/blog/positron-product-announcement-aug-2025/)). In a course aimed at coding beginners, this combination is immensely helpful in bringing important elements that had been previously hidden behind several menus in Rstudio out into the open where they are immediately available, reducing complicated workarounds. In my recent experience, it has been easier to teach beginners to code well with Positron than it was previously with Rstudio. - -Second, Data Science (and Bioinformatics) is increasingly moving in a multi-lingual programming direction. Flow Cytometry is not immune to this trend, [Python](https://www.python.org/), [Julia](https://julialang.org/) and [Rust](https://rust-lang.org/) are appearing more in [Cyto posters](https://www.cytoconference.org/index.html) each year. Positron is built to handle this, allowing us to bring in and use cool packages regardless of what language they are written, avoiding additional complicated workarounds to get them to work in Rstudio. - -And finally, having placed so much effort into making these resources available to the wider community, I don't want to provide all my examples using Rstudio only to find out two years from now that maintenance has been discontinued by Posit and everything needs to be remade. - -Consequently, I decided to use Positron for the course. This walk-through will cover some of the main layout elements to help start build some initial familiarity with the IDE, which we will continue to build on throughout the course. - - -# Getting Started - -When opening Positron for the first time, you will see something like this. Let's work our way around the screen, covering the major items in turn. - -![](images/01_PositronOpen.png) - -
- ---- - -# Interpreter - -On the upper right, above Session/Variables tab, you have the option to select the coding language (interpreter) being used by the project folder. For most of this course, you will likely see this set to R 4.5.2 (or your current R version). If your computer has Python installed, you may also see these versions appear within the interpreter drop-down menu. - -![](images/30_Session.png) - -
- ---- - -# Folders - -As [briefly covered](/course/00_WorkstationSetup/index.qmd) at the end of WorkStation walkthrough, the folders button to the right of the interpretor button allows us to open and work with Project Folders. From the drop-down, we can also Create New Folder from a template (which we will cover in the next section), or bring them in from existing GitHub repositories (as we did last section). You will also find the option to open other project folders that have been opened recently. - -![](images/31_ProjectFolderAccess.png) - -
- ---- - -# Panel - -At the bottom-center of the screen you will find the Panel region. This contains several tabs (Console, Terminal, etc). - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - - -## Console - -At the bottom of the sceen, you will first see the Console Tab. This is the tab where your lines of code when executed (run) will appear, as well as any messages, warnings or errors that get returned. On the right side of the console, you can find several buttons, among them restart R and delete session (for when you need a fresh start), and clear console (which keeps all previously run outputs and objects, but clears away the displayed text within the console). - -![](images/02_Console.png) - -
- ---- - -## Terminal -Right next to the Console tab is your Terminal tab. While the console tab is primarily used to run R code within Positron, the terminal is the interface where code containing system commands directed at at your computer is entered. We will use this less frequently, primarily in two context: 1) rendering Quarto documents, and 2) commiting changes to version control. Among the buttons on the right-side of the terminal to make note of are the + button to add a new terminal, and the trash/garbage can button to kill (stop) the terminal. - -![](images/03_Terminal.png) - -
- ---- - -The other tabs (Problems, Output, Ports, Debug Console) are used less frequently. I usually will Problems and Debug when something goes wrong with the code, as various warning and error messages will end up being displayed there. - -![](images/03_Terminal.png) - -
- ---- - -# Editor - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -Located above the panel section (ie, just above the console window) is the main area known as the Editor. It is typically where you end up writing your code. It displays any and all the files that you open. - -For example, when I open a .png for one of my projects, the image will appear within the editor area in the middle of my screen. - - -![](images/04_VisualizedPNG.png) - -
- ---- - -When the file I open is an .R script, I will be able to see and edit the code contained within that same area. - -![](images/05_R.png) - -
- ---- - -Should I open a Quarto markdown file (.qmd), I can see and edit both the written as well as the code chunks contained within. - -![](images/06_QMD.png) - -
- ---- - -Looking below the tabs of the opened files, I can see the file.path (location) for the file I currently have open and am working on. This is denoted by the \> \> \> interspersed with the parent folder names. - -![](images/07_FilePath.png) - -
- ---- - -Just above the file path, and below the tabs, we find a couple buttons. Preview is used to render a Quarto document into various types of documents (including .html, .pdf or .docx) as long as no errors are encountered. - -![](images/08_Preview.png) - -
- ---- - -Source tab will normally be the active view, which will show everything as code/[markdown](https://www.markdownguide.org/getting-started/) - -![](images/09_Source.png) - -
- ---- - -However, we can also switch to Visual mode (by right clicking and selecting Edit Visual Mode) which will visualize it in a similar manner as if we had rendered the document as an .html webpage. - -![](images/EditVisualMode.png) - -
- ---- - -![](images/10_Visual.png) - -
- ---- - -As more files are opened, they will appear as individual tabs. These can be opened and closed as need be. The color of the text also displays their saved status. - -![](images/11_NavigatingBetween.png) - -
- ---- - -## Help - -When trying to evaluate how a particular function is working in R, you can hover over it and positron will open up the documentation for that particular function if available, alternatively, you can enter ?theParticularFunctionsName in the console and hit enter to similarly view what is occuring. - -![](images/Help.png) - -# Primary Side Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -To open a file, several options exist. If they are present within your Project folder, you can click on the pages tab on the activity bar (far upper left) and then click on the file of interest shown within the primary side bar (between the activity bar and the editor). Alternatively, the Open Folder icon on the upper-left or entering "Ctrl + O"/"Command + O" will open a pop-up to allow you to navigate and select a folder elsewhere on your computer. - -![](images/OpenFile.png) - -
- ---- - -Unsaved changes to an open file are reflected by on the tab the change in color of the text, and the appearance of a dot. We can click the Save changes button to change this. - -![](images/SaveChanges.png) - -
- ---- - -# Secondary Side Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -The secondary side bar is found on the right-side of the screen, to the right of the Editor and Panel windows. It is divided between an upper, and a lower portion. - -## Variables -On the upper-portion of the Secondary Side Bar, we can find the Session window, containing the Variables tab. As you run (execute) lines of code, and different variables, objects and functions are created, these become visible under the variables tab on the upper right. - -![](images/SessionVariables.png) - -
- ---- - -For some types of objects (generally data.frames and other matrix-like objects), you can click on their listing under variables to expand to see additional details about the object (column names, etc.) as well as view a larger version which will appear within the Editor window. - -## Plots - -Similarly, any generated Plots or Documents will appear within the Secondary Side Bar, either under Plots (bottom) or Viewer (top) tabs. - -![](images/SessionPlots.png) - -
- ---- - -## View - -On the upper bar multiple tabs can be found, which we will explore in due time. Most useful to point out is the View tab. If you accidentally close your console, session or plots window, and are trying to get them to reapper, you would need to reselect them from this tab. - -![](images/28_View.png) - -
- ---- - -# Activity Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -At the far-left side of the screen, you will find the activity bar, which contains several tabs. Depending on which one you have opened, the contents will be displayed on the primary side bar next to it. - - -## Pages - -The pages tab and the left-side bar show you everything that is currently within your project folder, including all the folders, and files. Once version control with Git is initiated, new files are relected showing up as green text and a dot, while modified tracked files are reflected by light brown text and a dot. - -![](images/27_ChangesSinceLastCommit.png) - -
- ---- - -The dropdown arrows can be used to open and close specific folders to allow for better organization. There is also a scrollbar on the right-side of the side-bar to scroll through the entire folders contents. - -![](images/26_MainTab.png) - -
- ---- - -## Search - -The search tab on the left side bar is something that I use routinely. - -![](images/24_SearchTab.png) - -
- ---- - -It can help locate code that you had been working on, but have since forgotten where it is at. Here is an example of finding the files where I had used a function that needed modifying within a local project folder's files. - -![](images/25_SearchResults.png) - -
- ---- - -Similarly, if you need to replace a particular character string with another, the replace with field below can help simplify the task without having to track down and change 20 lines across 5 files. - -![](images/24_SearchTab.png) - -
- ---- - -## Extensions - -On the far-left side we can find the Activity bar, which contains several tabs. Which tab you have selected will then dictate the contents of your left side-bar. - -Occupying the left side bar are several tabs. One of these is Extensions, which shows "Plugins" (or the VScode equivalent) that extend the functionality of Positron further. The ones you have installed may vary, but the main ones in context of this course are Air (provides color and highlights syntax for R code to make interpretation easier) as well as Quarto (for rendering the various document types). - - -![](images/29_ExtensionsTab.png) - -
- ---- - -## Git - -The Git tab on the left side bar is where once version control is initiated for the project folder, we can see changes that have occurred to the individual files since the last commit. These changes can be added to a new commit by clicking on the + sign. This will be covered more extensively in the [next section](/course/00_Git/index.qmd) - -![](images/20_SaveChanges.png) - -
- ---- - -Similarly, if you want to discard a change that has occured, the circular arrow will revert to the last commited version. Selecting and pressing the delete button will similarly work. - -![](images/21_DiscardChanges.png) - -
- ---- - -Selecting the ... options will highlight all the various git functions, some of which we will cover more extensively in the [next section](/course/00_Git/index.qmd) and throughout the course. - -![](images/23_AdditionalGitOptions.png) - -
- ---- - - -# Wrap-up - -In this walk-through, we looked at some of the elements within Positron. Don't worry, you don't need to remember them all or what they do at this point of time, these will come with practice over the first few weeks of the course. - -In the [next section](/course/00_Git/index.qmd), we will take a closer look at using the version control software Git that we have previewed here. - -# Additional Resources - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief tour of Positron (YouTube)](https://youtu.be/4Ir_HX4riHw?si=awSUVjdzBPDVR4Iw) - -[Welcome to Positron](https://positron.posit.co/welcome.html) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using Positron" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/FSXsgaeM9Xo?si=kUZx9tn3KByDniEv) + + + +For screen-shot slides, click [here](/course/00_Positron/slides.qmd) + +# Background + +In this course, we are creating and working with code from the programming language [R](https://www.r-project.org/). However, in practice, we are not running the code directly using just the base R software. Typically, we are running an integrated development environment (IDE), which is an additional software running on top of base R. + +An IDE has the responsibility to help organize and manage the projects folders, pass along lines of code being executed (run) to the underlying R software, and then return and visualize the outputs in a manner that leads to increased producitivity. Examples of IDEs include [Positron](https://positron.posit.co/), [Visual Studio Code](https://code.visualstudio.com/) and [Rstudio](https://posit.co/downloads/). + +For this course, we will be using [Positron](https://positron.posit.co/) as our primary IDE. For those of you who have previous R experience, you are likely more familiar with [Rstudio](https://posit.co/downloads/) which is also made by Posit, and is the older of the two IDEs. Why use Positron for this course then? + +There are several reasons. First, Positron combines the best elements of both Rstudio (which preceeded it) and VS code (from which it's base infrastructure was [forked](https://posit.co/blog/positron-product-announcement-aug-2025/)). In a course aimed at coding beginners, this combination is immensely helpful in bringing important elements that had been previously hidden behind several menus in Rstudio out into the open where they are immediately available, reducing complicated workarounds. In my recent experience, it has been easier to teach beginners to code well with Positron than it was previously with Rstudio. + +Second, Data Science (and Bioinformatics) is increasingly moving in a multi-lingual programming direction. Flow Cytometry is not immune to this trend, [Python](https://www.python.org/), [Julia](https://julialang.org/) and [Rust](https://rust-lang.org/) are appearing more in [Cyto posters](https://www.cytoconference.org/index.html) each year. Positron is built to handle this, allowing us to bring in and use cool packages regardless of what language they are written, avoiding additional complicated workarounds to get them to work in Rstudio. + +And finally, having placed so much effort into making these resources available to the wider community, I don't want to provide all my examples using Rstudio only to find out two years from now that maintenance has been discontinued by Posit and everything needs to be remade. + +Consequently, I decided to use Positron for the course. This walk-through will cover some of the main layout elements to help start build some initial familiarity with the IDE, which we will continue to build on throughout the course. + + +# Getting Started + +When opening Positron for the first time, you will see something like this. Let's work our way around the screen, covering the major items in turn. + +![](images/01_PositronOpen.png) + +
+ +--- + +# Interpreter + +On the upper right, above Session/Variables tab, you have the option to select the coding language (interpreter) being used by the project folder. For most of this course, you will likely see this set to R 4.5.2 (or your current R version). If your computer has Python installed, you may also see these versions appear within the interpreter drop-down menu. + +![](images/30_Session.png) + +
+ +--- + +# Folders + +As [briefly covered](/course/00_WorkstationSetup/index.qmd) at the end of WorkStation walkthrough, the folders button to the right of the interpretor button allows us to open and work with Project Folders. From the drop-down, we can also Create New Folder from a template (which we will cover in the next section), or bring them in from existing GitHub repositories (as we did last section). You will also find the option to open other project folders that have been opened recently. + +![](images/31_ProjectFolderAccess.png) + +
+ +--- + +# Panel + +At the bottom-center of the screen you will find the Panel region. This contains several tabs (Console, Terminal, etc). + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + + +## Console + +At the bottom of the sceen, you will first see the Console Tab. This is the tab where your lines of code when executed (run) will appear, as well as any messages, warnings or errors that get returned. On the right side of the console, you can find several buttons, among them restart R and delete session (for when you need a fresh start), and clear console (which keeps all previously run outputs and objects, but clears away the displayed text within the console). + +![](images/02_Console.png) + +
+ +--- + +## Terminal +Right next to the Console tab is your Terminal tab. While the console tab is primarily used to run R code within Positron, the terminal is the interface where code containing system commands directed at at your computer is entered. We will use this less frequently, primarily in two context: 1) rendering Quarto documents, and 2) commiting changes to version control. Among the buttons on the right-side of the terminal to make note of are the + button to add a new terminal, and the trash/garbage can button to kill (stop) the terminal. + +![](images/03_Terminal.png) + +
+ +--- + +The other tabs (Problems, Output, Ports, Debug Console) are used less frequently. I usually will Problems and Debug when something goes wrong with the code, as various warning and error messages will end up being displayed there. + +![](images/03_Terminal.png) + +
+ +--- + +# Editor + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +Located above the panel section (ie, just above the console window) is the main area known as the Editor. It is typically where you end up writing your code. It displays any and all the files that you open. + +For example, when I open a .png for one of my projects, the image will appear within the editor area in the middle of my screen. + + +![](images/04_VisualizedPNG.png) + +
+ +--- + +When the file I open is an .R script, I will be able to see and edit the code contained within that same area. + +![](images/05_R.png) + +
+ +--- + +Should I open a Quarto markdown file (.qmd), I can see and edit both the written as well as the code chunks contained within. + +![](images/06_QMD.png) + +
+ +--- + +Looking below the tabs of the opened files, I can see the file.path (location) for the file I currently have open and am working on. This is denoted by the \> \> \> interspersed with the parent folder names. + +![](images/07_FilePath.png) + +
+ +--- + +Just above the file path, and below the tabs, we find a couple buttons. Preview is used to render a Quarto document into various types of documents (including .html, .pdf or .docx) as long as no errors are encountered. + +![](images/08_Preview.png) + +
+ +--- + +Source tab will normally be the active view, which will show everything as code/[markdown](https://www.markdownguide.org/getting-started/) + +![](images/09_Source.png) + +
+ +--- + +However, we can also switch to Visual mode (by right clicking and selecting Edit Visual Mode) which will visualize it in a similar manner as if we had rendered the document as an .html webpage. + +![](images/EditVisualMode.png) + +
+ +--- + +![](images/10_Visual.png) + +
+ +--- + +As more files are opened, they will appear as individual tabs. These can be opened and closed as need be. The color of the text also displays their saved status. + +![](images/11_NavigatingBetween.png) + +
+ +--- + +## Help + +When trying to evaluate how a particular function is working in R, you can hover over it and positron will open up the documentation for that particular function if available, alternatively, you can enter ?theParticularFunctionsName in the console and hit enter to similarly view what is occuring. + +![](images/Help.png) + +# Primary Side Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +To open a file, several options exist. If they are present within your Project folder, you can click on the pages tab on the activity bar (far upper left) and then click on the file of interest shown within the primary side bar (between the activity bar and the editor). Alternatively, the Open Folder icon on the upper-left or entering "Ctrl + O"/"Command + O" will open a pop-up to allow you to navigate and select a folder elsewhere on your computer. + +![](images/OpenFile.png) + +
+ +--- + +Unsaved changes to an open file are reflected by on the tab the change in color of the text, and the appearance of a dot. We can click the Save changes button to change this. + +![](images/SaveChanges.png) + +
+ +--- + +# Secondary Side Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +The secondary side bar is found on the right-side of the screen, to the right of the Editor and Panel windows. It is divided between an upper, and a lower portion. + +## Variables +On the upper-portion of the Secondary Side Bar, we can find the Session window, containing the Variables tab. As you run (execute) lines of code, and different variables, objects and functions are created, these become visible under the variables tab on the upper right. + +![](images/SessionVariables.png) + +
+ +--- + +For some types of objects (generally data.frames and other matrix-like objects), you can click on their listing under variables to expand to see additional details about the object (column names, etc.) as well as view a larger version which will appear within the Editor window. + +## Plots + +Similarly, any generated Plots or Documents will appear within the Secondary Side Bar, either under Plots (bottom) or Viewer (top) tabs. + +![](images/SessionPlots.png) + +
+ +--- + +## View + +On the upper bar multiple tabs can be found, which we will explore in due time. Most useful to point out is the View tab. If you accidentally close your console, session or plots window, and are trying to get them to reapper, you would need to reselect them from this tab. + +![](images/28_View.png) + +
+ +--- + +# Activity Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +At the far-left side of the screen, you will find the activity bar, which contains several tabs. Depending on which one you have opened, the contents will be displayed on the primary side bar next to it. + + +## Pages + +The pages tab and the left-side bar show you everything that is currently within your project folder, including all the folders, and files. Once version control with Git is initiated, new files are relected showing up as green text and a dot, while modified tracked files are reflected by light brown text and a dot. + +![](images/27_ChangesSinceLastCommit.png) + +
+ +--- + +The dropdown arrows can be used to open and close specific folders to allow for better organization. There is also a scrollbar on the right-side of the side-bar to scroll through the entire folders contents. + +![](images/26_MainTab.png) + +
+ +--- + +## Search + +The search tab on the left side bar is something that I use routinely. + +![](images/24_SearchTab.png) + +
+ +--- + +It can help locate code that you had been working on, but have since forgotten where it is at. Here is an example of finding the files where I had used a function that needed modifying within a local project folder's files. + +![](images/25_SearchResults.png) + +
+ +--- + +Similarly, if you need to replace a particular character string with another, the replace with field below can help simplify the task without having to track down and change 20 lines across 5 files. + +![](images/24_SearchTab.png) + +
+ +--- + +## Extensions + +On the far-left side we can find the Activity bar, which contains several tabs. Which tab you have selected will then dictate the contents of your left side-bar. + +Occupying the left side bar are several tabs. One of these is Extensions, which shows "Plugins" (or the VScode equivalent) that extend the functionality of Positron further. The ones you have installed may vary, but the main ones in context of this course are Air (provides color and highlights syntax for R code to make interpretation easier) as well as Quarto (for rendering the various document types). + + +![](images/29_ExtensionsTab.png) + +
+ +--- + +## Git + +The Git tab on the left side bar is where once version control is initiated for the project folder, we can see changes that have occurred to the individual files since the last commit. These changes can be added to a new commit by clicking on the + sign. This will be covered more extensively in the [next section](/course/00_Git/index.qmd) + +![](images/20_SaveChanges.png) + +
+ +--- + +Similarly, if you want to discard a change that has occured, the circular arrow will revert to the last commited version. Selecting and pressing the delete button will similarly work. + +![](images/21_DiscardChanges.png) + +
+ +--- + +Selecting the ... options will highlight all the various git functions, some of which we will cover more extensively in the [next section](/course/00_Git/index.qmd) and throughout the course. + +![](images/23_AdditionalGitOptions.png) + +
+ +--- + + +# Wrap-up + +In this walk-through, we looked at some of the elements within Positron. Don't worry, you don't need to remember them all or what they do at this point of time, these will come with practice over the first few weeks of the course. + +In the [next section](/course/00_Git/index.qmd), we will take a closer look at using the version control software Git that we have previewed here. + +# Additional Resources + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief tour of Positron (YouTube)](https://youtu.be/4Ir_HX4riHw?si=awSUVjdzBPDVR4Iw) + +[Welcome to Positron](https://positron.posit.co/welcome.html) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Positron/slides.qmd b/course/00_Positron/slides.qmd index 149a1f9..47eee0d 100644 --- a/course/00_Positron/slides.qmd +++ b/course/00_Positron/slides.qmd @@ -1,554 +1,554 @@ ---- -title: "Using Positron" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -In this course, we are creating and working with code from the programming language [R](https://www.r-project.org/). However, in practice, we are not running the code directly using just the base R software. Typically, we are running an integrated development environment (IDE), which is an additional software running on top of base R. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -An IDE has the responsibility to help organize and manage the projects folders, pass along lines of code being executed (run) to the underlying R software, and then return and visualize the outputs in a manner that leads to increased producitivity. Examples of IDEs include [Positron](https://positron.posit.co/), [Visual Studio Code](https://code.visualstudio.com/) and [Rstudio](https://posit.co/downloads/). -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For this course, we will be using [Positron](https://positron.posit.co/) as our primary IDE. For those of you who have previous R experience, you are likely more familiar with [Rstudio](https://posit.co/downloads/) which is also made by Posit, and is the older of the two IDEs. Why use Positron for this course then? -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -There are several reasons. First, Positron combines the best elements of both Rstudio (which preceeded it) and VS code (from which it's base infrastructure was [forked](https://posit.co/blog/positron-product-announcement-aug-2025/)). In a course aimed at coding beginners, this combination is immensely helpful in bringing important elements that had been previously hidden behind several menus in Rstudio out into the open where they are immediately available, reducing complicated workarounds. In my recent experience, it has been easier to teach beginners to code well with Positron than it was previously with Rstudio. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Second, Data Science (and Bioinformatics) is increasingly moving in a multi-lingual programming direction. Flow Cytometry is not immune to this trend, [Python](https://www.python.org/), [Julia](https://julialang.org/) and [Rust](https://rust-lang.org/) are appearing more in [Cyto posters](https://www.cytoconference.org/index.html) each year. Positron is built to handle this, allowing us to bring in and use cool packages regardless of what language they are written, avoiding additional complicated workarounds to get them to work in Rstudio. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And finally, having placed so much effort into making these resources available to the wider community, I don't want to provide all my examples using Rstudio only to find out two years from now that maintenance has been discontinued by Posit and everything needs to be remade. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -Consequently, I decided to use Positron for the course. This walk-through will cover some of the main layout elements to help start build some initial familiarity with the IDE, which we will continue to build on throughout the course. -::: -::: - -# Getting Started - -::: {.fragment} -::: {.callout-tip title="."} -When opening Positron for the first time, you will see something like this. Let's work our way around the screen, covering the major items in turn. -::: -::: - ---- - -![](images/01_PositronOpen.png) - - ---- - -# Interpreter - -::: {.fragment} -::: {.callout-tip title="."} -On the upper right, above Session/Variables tab, you have the option to select the coding language (interpreter) being used by the project folder. For most of this course, you will likely see this set to R 4.5.2 (or your current R version). If your computer has Python installed, you may also see these versions appear within the interpreter drop-down menu. -::: -::: - ---- - -![](images/30_Session.png) - - ---- - -# Folders - -::: {.fragment} -::: {.callout-tip title="."} -As [briefly covered](/course/00_WorkstationSetup/index.qmd) at the end of WorkStation walkthrough, the folders button to the right of the interpretor button allows us to open and work with Project Folders. From the drop-down, we can also Create New Folder from a template (which we will cover in the next section), or bring them in from existing GitHub repositories (as we did last section). You will also find the option to open other project folders that have been opened recently. -::: -::: - ---- - -![](images/31_ProjectFolderAccess.png) - - ---- - -# Panel - -::: {.fragment} -::: {.callout-tip title="."} -At the bottom-center of the screen you will find the Panel region. This contains several tabs (Console, Terminal, etc). -::: -::: - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - - -## Console - -::: {.fragment} -::: {.callout-tip title="."} -At the bottom of the sceen, you will first see the Console Tab. This is the tab where your lines of code when executed (run) will appear, as well as any messages, warnings or errors that get returned. On the right side of the console, you can find several buttons, among them restart R and delete session (for when you need a fresh start), and clear console (which keeps all previously run outputs and objects, but clears away the displayed text within the console). -::: -::: - ---- - -![](images/02_Console.png) - - ---- - -## Terminal - -::: {.fragment} -::: {.callout-tip title="."} -Right next to the Console tab is your Terminal tab. While the console tab is primarily used to run R code within Positron, the terminal is the interface where code containing system commands directed at at your computer is entered. We will use this less frequently, primarily in two context: 1) rendering Quarto documents, and 2) commiting changes to version control. Among the buttons on the right-side of the terminal to make note of are the + button to add a new terminal, and the trash/garbage can button to kill (stop) the terminal. -::: -::: - ---- - -![](images/03_Terminal.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The other tabs (Problems, Output, Ports, Debug Console) are used less frequently. I usually will Problems and Debug when something goes wrong with the code, as various warning and error messages will end up being displayed there. -::: -::: - ---- - -![](images/03_Terminal.png) - - ---- - -# Editor - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Located above the panel section (ie, just above the console window) is the main area known as the Editor. It is typically where you end up writing your code. It displays any and all the files that you open. - -For example, when I open a .png for one of my projects, the image will appear within the editor area in the middle of my screen. -::: -::: - ---- - -![](images/04_VisualizedPNG.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When the file I open is an .R script, I will be able to see and edit the code contained within that same area. -::: -::: - ---- - -![](images/05_R.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Should I open a Quarto markdown file (.qmd), I can see and edit both the written as well as the code chunks contained within. -::: -::: - ---- - -![](images/06_QMD.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Looking below the tabs of the opened files, I can see the file.path (location) for the file I currently have open and am working on. This is denoted by the \> \> \> interspersed with the parent folder names. -::: -::: - ---- - -![](images/07_FilePath.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Just above the file path, and below the tabs, we find a couple buttons. Preview is used to render a Quarto document into various types of documents (including .html, .pdf or .docx) as long as no errors are encountered. -::: -::: - ---- - -![](images/08_Preview.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Source tab will normally be the active view, which will show everything as code/[markdown](https://www.markdownguide.org/getting-started/) -::: -::: - ---- - -![](images/09_Source.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -However, we can also switch to Visual mode (by right clicking and selecting Edit Visual Mode) which will visualize it in a similar manner as if we had rendered the document as an .html webpage. -::: -::: - ---- - -![](images/EditVisualMode.png) - ---- - -![](images/10_Visual.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As more files are opened, they will appear as individual tabs. These can be opened and closed as need be. The color of the text also displays their saved status. -::: -::: - ---- - -![](images/11_NavigatingBetween.png) - - ---- - -## Help - -::: {.fragment} -::: {.callout-tip title="."} -When trying to evaluate how a particular function is working in R, you can hover over it and positron will open up the documentation for that particular function if available, alternatively, you can enter ?theParticularFunctionsName in the console and hit enter to similarly view what is occuring. -::: -::: - ---- - -![](images/Help.png) - -# Primary Side Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To open a file, several options exist. If they are present within your Project folder, you can click on the pages tab on the activity bar (far upper left) and then click on the file of interest shown within the primary side bar (between the activity bar and the editor). Alternatively, the Open Folder icon on the upper-left or entering "Ctrl + O"/"Command + O" will open a pop-up to allow you to navigate and select a folder elsewhere on your computer. -::: -::: - ---- - -![](images/OpenFile.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Unsaved changes to an open file are reflected by on the tab the change in color of the text, and the appearance of a dot. We can click the Save changes button to change this. -::: -::: - ---- - -![](images/SaveChanges.png) - - ---- - -# Secondary Side Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -::: {.fragment} -::: {.callout-tip title="."} -The secondary side bar is found on the right-side of the screen, to the right of the Editor and Panel windows. It is divided between an upper, and a lower portion. -::: -::: - -## Variables - -::: {.fragment} -::: {.callout-tip title="."} -On the upper-portion of the Secondary Side Bar, we can find the Session window, containing the Variables tab. As you run (execute) lines of code, and different variables, objects and functions are created, these become visible under the variables tab on the upper right. -::: -::: - ---- - -![](images/SessionVariables.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For some types of objects (generally data.frames and other matrix-like objects), you can click on their listing under variables to expand to see additional details about the object (column names, etc.) as well as view a larger version which will appear within the Editor window. -::: -::: - -## Plots - -::: {.fragment} -::: {.callout-tip title="."} -Similarly, any generated Plots or Documents will appear within the Secondary Side Bar, either under Plots (bottom) or Viewer (top) tabs. -::: -::: - ---- - -![](images/SessionPlots.png) - - ---- - -## View - -::: {.fragment} -::: {.callout-tip title="."} -On the upper bar multiple tabs can be found, which we will explore in due time. Most useful to point out is the View tab. If you accidentally close your console, session or plots window, and are trying to get them to reapper, you would need to reselect them from this tab. -::: -::: - ---- - -![](images/28_View.png) - - ---- - -# Activity Bar - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -::: {.fragment} -::: {.callout-tip title="."} -At the far-left side of the screen, you will find the activity bar, which contains several tabs. Depending on which one you have opened, the contents will be displayed on the primary side bar next to it. -::: -::: - -## Pages - -::: {.fragment} -::: {.callout-tip title="."} -The pages tab and the left-side bar show you everything that is currently within your project folder, including all the folders, and files. Once version control with Git is initiated, new files are relected showing up as green text and a dot, while modified tracked files are reflected by light brown text and a dot. -::: -::: - ---- - -![](images/27_ChangesSinceLastCommit.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The dropdown arrows can be used to open and close specific folders to allow for better organization. There is also a scrollbar on the right-side of the side-bar to scroll through the entire folders contents. -::: -::: - ---- - -![](images/26_MainTab.png) - - ---- - -## Search - -::: {.fragment} -::: {.callout-tip title="."} -The search tab on the left side bar is something that I use routinely. -::: -::: - ---- - -![](images/24_SearchTab.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -It can help locate code that you had been working on, but have since forgotten where it is at. Here is an example of finding the files where I had used a function that needed modifying within a local project folder's files. -::: -::: - ---- - -![](images/25_SearchResults.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similarly, if you need to replace a particular character string with another, the replace with field below can help simplify the task without having to track down and change 20 lines across 5 files. -::: -::: - ---- - -![](images/24_SearchTab.png) - - ---- - -## Extensions - -::: {.fragment} -::: {.callout-tip title="."} -On the far-left side we can find the Activity bar, which contains several tabs. Which tab you have selected will then dictate the contents of your left side-bar. - -Occupying the left side bar are several tabs. One of these is Extensions, which shows "Plugins" (or the VScode equivalent) that extend the functionality of Positron further. The ones you have installed may vary, but the main ones in context of this course are Air (provides color and highlights syntax for R code to make interpretation easier) as well as Quarto (for rendering the various document types). -::: -::: - ---- - -![](images/29_ExtensionsTab.png) - - ---- - -## Git - -::: {.fragment} -::: {.callout-tip title="."} -The Git tab on the left side bar is where once version control is initiated for the project folder, we can see changes that have occurred to the individual files since the last commit. These changes can be added to a new commit by clicking on the + sign. This will be covered more extensively in the [next section](/course/00_Git/index.qmd) -::: -::: - ---- - -![](images/20_SaveChanges.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similarly, if you want to discard a change that has occured, the circular arrow will revert to the last commited version. Selecting and pressing the delete button will similarly work. -::: -::: - ---- - -![](images/21_DiscardChanges.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Selecting the ... options will highlight all the various git functions, some of which we will cover more extensively in the [next section](/course/00_Git/index.qmd) and throughout the course. -::: -::: - ---- - -![](images/23_AdditionalGitOptions.png) - - ---- - - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -In this walk-through, we looked at some of the elements within Positron. Don't worry, you don't need to remember them all or what they do at this point of time, these will come with practice over the first few weeks of the course. - -In the [next section](/course/00_Git/index.qmd), we will take a closer look at using the version control software Git that we have previewed here. -::: -::: - -# Additional Resources - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief tour of Positron (YouTube)](https://youtu.be/4Ir_HX4riHw?si=awSUVjdzBPDVR4Iw) - -[Welcome to Positron](https://positron.posit.co/welcome.html) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Using Positron" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +In this course, we are creating and working with code from the programming language [R](https://www.r-project.org/). However, in practice, we are not running the code directly using just the base R software. Typically, we are running an integrated development environment (IDE), which is an additional software running on top of base R. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +An IDE has the responsibility to help organize and manage the projects folders, pass along lines of code being executed (run) to the underlying R software, and then return and visualize the outputs in a manner that leads to increased producitivity. Examples of IDEs include [Positron](https://positron.posit.co/), [Visual Studio Code](https://code.visualstudio.com/) and [Rstudio](https://posit.co/downloads/). +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For this course, we will be using [Positron](https://positron.posit.co/) as our primary IDE. For those of you who have previous R experience, you are likely more familiar with [Rstudio](https://posit.co/downloads/) which is also made by Posit, and is the older of the two IDEs. Why use Positron for this course then? +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +There are several reasons. First, Positron combines the best elements of both Rstudio (which preceeded it) and VS code (from which it's base infrastructure was [forked](https://posit.co/blog/positron-product-announcement-aug-2025/)). In a course aimed at coding beginners, this combination is immensely helpful in bringing important elements that had been previously hidden behind several menus in Rstudio out into the open where they are immediately available, reducing complicated workarounds. In my recent experience, it has been easier to teach beginners to code well with Positron than it was previously with Rstudio. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Second, Data Science (and Bioinformatics) is increasingly moving in a multi-lingual programming direction. Flow Cytometry is not immune to this trend, [Python](https://www.python.org/), [Julia](https://julialang.org/) and [Rust](https://rust-lang.org/) are appearing more in [Cyto posters](https://www.cytoconference.org/index.html) each year. Positron is built to handle this, allowing us to bring in and use cool packages regardless of what language they are written, avoiding additional complicated workarounds to get them to work in Rstudio. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And finally, having placed so much effort into making these resources available to the wider community, I don't want to provide all my examples using Rstudio only to find out two years from now that maintenance has been discontinued by Posit and everything needs to be remade. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +Consequently, I decided to use Positron for the course. This walk-through will cover some of the main layout elements to help start build some initial familiarity with the IDE, which we will continue to build on throughout the course. +::: +::: + +# Getting Started + +::: {.fragment} +::: {.callout-tip title="."} +When opening Positron for the first time, you will see something like this. Let's work our way around the screen, covering the major items in turn. +::: +::: + +--- + +![](images/01_PositronOpen.png) + + +--- + +# Interpreter + +::: {.fragment} +::: {.callout-tip title="."} +On the upper right, above Session/Variables tab, you have the option to select the coding language (interpreter) being used by the project folder. For most of this course, you will likely see this set to R 4.5.2 (or your current R version). If your computer has Python installed, you may also see these versions appear within the interpreter drop-down menu. +::: +::: + +--- + +![](images/30_Session.png) + + +--- + +# Folders + +::: {.fragment} +::: {.callout-tip title="."} +As [briefly covered](/course/00_WorkstationSetup/index.qmd) at the end of WorkStation walkthrough, the folders button to the right of the interpretor button allows us to open and work with Project Folders. From the drop-down, we can also Create New Folder from a template (which we will cover in the next section), or bring them in from existing GitHub repositories (as we did last section). You will also find the option to open other project folders that have been opened recently. +::: +::: + +--- + +![](images/31_ProjectFolderAccess.png) + + +--- + +# Panel + +::: {.fragment} +::: {.callout-tip title="."} +At the bottom-center of the screen you will find the Panel region. This contains several tabs (Console, Terminal, etc). +::: +::: + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + + +## Console + +::: {.fragment} +::: {.callout-tip title="."} +At the bottom of the sceen, you will first see the Console Tab. This is the tab where your lines of code when executed (run) will appear, as well as any messages, warnings or errors that get returned. On the right side of the console, you can find several buttons, among them restart R and delete session (for when you need a fresh start), and clear console (which keeps all previously run outputs and objects, but clears away the displayed text within the console). +::: +::: + +--- + +![](images/02_Console.png) + + +--- + +## Terminal + +::: {.fragment} +::: {.callout-tip title="."} +Right next to the Console tab is your Terminal tab. While the console tab is primarily used to run R code within Positron, the terminal is the interface where code containing system commands directed at at your computer is entered. We will use this less frequently, primarily in two context: 1) rendering Quarto documents, and 2) commiting changes to version control. Among the buttons on the right-side of the terminal to make note of are the + button to add a new terminal, and the trash/garbage can button to kill (stop) the terminal. +::: +::: + +--- + +![](images/03_Terminal.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The other tabs (Problems, Output, Ports, Debug Console) are used less frequently. I usually will Problems and Debug when something goes wrong with the code, as various warning and error messages will end up being displayed there. +::: +::: + +--- + +![](images/03_Terminal.png) + + +--- + +# Editor + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Located above the panel section (ie, just above the console window) is the main area known as the Editor. It is typically where you end up writing your code. It displays any and all the files that you open. + +For example, when I open a .png for one of my projects, the image will appear within the editor area in the middle of my screen. +::: +::: + +--- + +![](images/04_VisualizedPNG.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When the file I open is an .R script, I will be able to see and edit the code contained within that same area. +::: +::: + +--- + +![](images/05_R.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Should I open a Quarto markdown file (.qmd), I can see and edit both the written as well as the code chunks contained within. +::: +::: + +--- + +![](images/06_QMD.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Looking below the tabs of the opened files, I can see the file.path (location) for the file I currently have open and am working on. This is denoted by the \> \> \> interspersed with the parent folder names. +::: +::: + +--- + +![](images/07_FilePath.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Just above the file path, and below the tabs, we find a couple buttons. Preview is used to render a Quarto document into various types of documents (including .html, .pdf or .docx) as long as no errors are encountered. +::: +::: + +--- + +![](images/08_Preview.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Source tab will normally be the active view, which will show everything as code/[markdown](https://www.markdownguide.org/getting-started/) +::: +::: + +--- + +![](images/09_Source.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +However, we can also switch to Visual mode (by right clicking and selecting Edit Visual Mode) which will visualize it in a similar manner as if we had rendered the document as an .html webpage. +::: +::: + +--- + +![](images/EditVisualMode.png) + +--- + +![](images/10_Visual.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As more files are opened, they will appear as individual tabs. These can be opened and closed as need be. The color of the text also displays their saved status. +::: +::: + +--- + +![](images/11_NavigatingBetween.png) + + +--- + +## Help + +::: {.fragment} +::: {.callout-tip title="."} +When trying to evaluate how a particular function is working in R, you can hover over it and positron will open up the documentation for that particular function if available, alternatively, you can enter ?theParticularFunctionsName in the console and hit enter to similarly view what is occuring. +::: +::: + +--- + +![](images/Help.png) + +# Primary Side Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To open a file, several options exist. If they are present within your Project folder, you can click on the pages tab on the activity bar (far upper left) and then click on the file of interest shown within the primary side bar (between the activity bar and the editor). Alternatively, the Open Folder icon on the upper-left or entering "Ctrl + O"/"Command + O" will open a pop-up to allow you to navigate and select a folder elsewhere on your computer. +::: +::: + +--- + +![](images/OpenFile.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Unsaved changes to an open file are reflected by on the tab the change in color of the text, and the appearance of a dot. We can click the Save changes button to change this. +::: +::: + +--- + +![](images/SaveChanges.png) + + +--- + +# Secondary Side Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +::: {.fragment} +::: {.callout-tip title="."} +The secondary side bar is found on the right-side of the screen, to the right of the Editor and Panel windows. It is divided between an upper, and a lower portion. +::: +::: + +## Variables + +::: {.fragment} +::: {.callout-tip title="."} +On the upper-portion of the Secondary Side Bar, we can find the Session window, containing the Variables tab. As you run (execute) lines of code, and different variables, objects and functions are created, these become visible under the variables tab on the upper right. +::: +::: + +--- + +![](images/SessionVariables.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For some types of objects (generally data.frames and other matrix-like objects), you can click on their listing under variables to expand to see additional details about the object (column names, etc.) as well as view a larger version which will appear within the Editor window. +::: +::: + +## Plots + +::: {.fragment} +::: {.callout-tip title="."} +Similarly, any generated Plots or Documents will appear within the Secondary Side Bar, either under Plots (bottom) or Viewer (top) tabs. +::: +::: + +--- + +![](images/SessionPlots.png) + + +--- + +## View + +::: {.fragment} +::: {.callout-tip title="."} +On the upper bar multiple tabs can be found, which we will explore in due time. Most useful to point out is the View tab. If you accidentally close your console, session or plots window, and are trying to get them to reapper, you would need to reselect them from this tab. +::: +::: + +--- + +![](images/28_View.png) + + +--- + +# Activity Bar + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +::: {.fragment} +::: {.callout-tip title="."} +At the far-left side of the screen, you will find the activity bar, which contains several tabs. Depending on which one you have opened, the contents will be displayed on the primary side bar next to it. +::: +::: + +## Pages + +::: {.fragment} +::: {.callout-tip title="."} +The pages tab and the left-side bar show you everything that is currently within your project folder, including all the folders, and files. Once version control with Git is initiated, new files are relected showing up as green text and a dot, while modified tracked files are reflected by light brown text and a dot. +::: +::: + +--- + +![](images/27_ChangesSinceLastCommit.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The dropdown arrows can be used to open and close specific folders to allow for better organization. There is also a scrollbar on the right-side of the side-bar to scroll through the entire folders contents. +::: +::: + +--- + +![](images/26_MainTab.png) + + +--- + +## Search + +::: {.fragment} +::: {.callout-tip title="."} +The search tab on the left side bar is something that I use routinely. +::: +::: + +--- + +![](images/24_SearchTab.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +It can help locate code that you had been working on, but have since forgotten where it is at. Here is an example of finding the files where I had used a function that needed modifying within a local project folder's files. +::: +::: + +--- + +![](images/25_SearchResults.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similarly, if you need to replace a particular character string with another, the replace with field below can help simplify the task without having to track down and change 20 lines across 5 files. +::: +::: + +--- + +![](images/24_SearchTab.png) + + +--- + +## Extensions + +::: {.fragment} +::: {.callout-tip title="."} +On the far-left side we can find the Activity bar, which contains several tabs. Which tab you have selected will then dictate the contents of your left side-bar. + +Occupying the left side bar are several tabs. One of these is Extensions, which shows "Plugins" (or the VScode equivalent) that extend the functionality of Positron further. The ones you have installed may vary, but the main ones in context of this course are Air (provides color and highlights syntax for R code to make interpretation easier) as well as Quarto (for rendering the various document types). +::: +::: + +--- + +![](images/29_ExtensionsTab.png) + + +--- + +## Git + +::: {.fragment} +::: {.callout-tip title="."} +The Git tab on the left side bar is where once version control is initiated for the project folder, we can see changes that have occurred to the individual files since the last commit. These changes can be added to a new commit by clicking on the + sign. This will be covered more extensively in the [next section](/course/00_Git/index.qmd) +::: +::: + +--- + +![](images/20_SaveChanges.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similarly, if you want to discard a change that has occured, the circular arrow will revert to the last commited version. Selecting and pressing the delete button will similarly work. +::: +::: + +--- + +![](images/21_DiscardChanges.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Selecting the ... options will highlight all the various git functions, some of which we will cover more extensively in the [next section](/course/00_Git/index.qmd) and throughout the course. +::: +::: + +--- + +![](images/23_AdditionalGitOptions.png) + + +--- + + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +In this walk-through, we looked at some of the elements within Positron. Don't worry, you don't need to remember them all or what they do at this point of time, these will come with practice over the first few weeks of the course. + +In the [next section](/course/00_Git/index.qmd), we will take a closer look at using the version control software Git that we have previewed here. +::: +::: + +# Additional Resources + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief tour of Positron (YouTube)](https://youtu.be/4Ir_HX4riHw?si=awSUVjdzBPDVR4Iw) + +[Welcome to Positron](https://positron.posit.co/welcome.html) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Quarto/index.qmd b/course/00_Quarto/index.qmd index 1f111d9..2d07a6e 100644 --- a/course/00_Quarto/index.qmd +++ b/course/00_Quarto/index.qmd @@ -1,370 +1,370 @@ ---- -title: "Introduction to Quarto" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/VQNFWzKxgdk?si=Lbg1mbbnhYAqjSyZ) - - - -For screen-shot slides, click [here](/course/00_Quarto/slides.qmd) - -# Background - -In the [previous section](/course/00_Git/index.qmd), we briefly introduced Quarto Markdown Documents (.qmd) while working our way through version control concepts. Since we will be using .qmd files extensively throughout this course, this section will explore how we can build on these concepts to modify these files to create a variety of outputs (ranging from Word documents, pdfs, html webpages). We will also take a look at how to use code-chunk arguments to control what code is run or displayed within. - -# Getting Started - -We will start off by creating a a new .QMD document within our GitPractice repository. As we saw in the [previous section](/course/00_Git/index.qmd), the basic elements include: - -1) A [YAML]() header, that dictates formatting -2) The text body, where we can include documentation -3) Code-block chunks, in which we can write code that can be executed, as well as # comments - -![](images/00_BasicQMD.png) - -
- ---- - -## Render/Preview - -The preview button, at the upper-left end of the Editor, is used to render/knit a quarto document. This triggers the process by which code-chunks are run, and then the outputs are cobbled together into the file format type designated by the YAML header. - - -![](images/01_Preview.png) - -
- ---- - -### HTML - -In this case, the YAML header's format argument is set to html. After clicking preview, we can see the various rendering steps appear in the console below. Since no errors occured, the html document was formed succesfully and appears as a file in the left side-bar. Additional, a preview of the document appears in the View tab of the right side-bar, allowing for quick visual inspection. - -![](images/03_Preview.png) - -
- ---- - -Alternatively, we can render a document via the terminal, by entering "quarto render ", followed by the name of the document. - -![](images/02_Preview.png) - -
- ---- - -This results similar process as what we saw with the preview button - -![](images/04_Preview.png) - -
- ---- - -We can also open the .html document via our File Explorer, which will open it within our web browser. - -![](images/05_HTML.png) - -
- ---- - -Quarto documents can be rendered (previewed) in other formats besides html. These include pdf, Word documents (docx), and slides (revealjs). This is set by the format argument within the YAML header. - -### PDF - -By switching the format argument from html to pdf, we can render the document as a pdf - -![](images/06_PDF.png) - -
- ---- - -We can see the pdf is now listed in the list of files, with a preview shown on the right side-bar. - -![](images/06_PDFOutput.png) - -
- ---- - -### Docx - -We can also generate Word documents (.docx) as well. - -![](images/07_Docx.png) - -
- ---- - -In this case, we can see that a Word document file was created, but nothing appears in the View tab. This is because the format is not yet supported for the View tab. We can however open and view the Word document via our File explorer. - -![](images/07_DocxRender.png) - -
- ---- - -Which shows a Word Document style output. - -![](images/07_DocxOutput.png) - -
- ---- - -## YAML - -We can additionally provide additional custom inputs to the YAML header. A couple examples include providing the document author and date. - -![](images/08_Yaml.png) - -
- ---- - -Which we can see are updated after we preview/render. - -![](images/08_Yaml2.png) - -
- ---- - - -## Table of Contents - -In the previous section, we saw that we could provide headings and subheadings to our .qmd file by placing a \# at the start of a line in the text portion of the document. A subheading was designated by a \#\#, with additional hierarchy being designated by appending an additional \#. - - -![](images/09_Headers.png) - -
- ---- - -We can use the heading information to generate a table of contents for our document. To do this, we add a toc argument to the yaml header, and set it to TRUE. -After rendering, it appears on the upper-right side of the document. - -![](images/10_TOC.png) - -
- ---- - -Notice, that the subheaders do not appear currently within the TOC. - -![](images/11_HeaderSubs.png) - -
- ---- - -We can fix this by setting a toc-expand argument in the YAML to true. - -![](images/12_TOCexpanded.png) - -
- ---- - - -## Code Chunk Arguments - -As we briefly touched on in the [last section](/course/00_Git/index.qmd), code-chunks can be modified by including arguments, which affect whether a particular code chunk gets evaluated. In that example, we included a "#| eval: FALSE" to the install commands since we did not want them to be re-run subsequently. We will take a closer look at the other arguments in this section. - -### Eval - -The code-chunk argument, "Eval", is used to determine when a code-chunk get's evaluated. When set to true (or by default if no eval argument is included), the code-chunks contents will be run/executed, and the output will appear. We can see this in the html output, as below the code block, we get back the address of my working directory. - -![](images/13_EvalTRUE.png) - -
- ---- - -When we switch the Eval argument to FALSE, and then render the document, we can see that the code block remains, but we do not get any output for the code contained within. - -In every-day practice, we will "use eval: FALSE" arguments when we want to keep the code for later use, but want to manually run the code contained within ourselves. - -![](images/14_EvalFALSE.png) - -
- ---- - -### Echo - -The code-block argument "echo" dictates whether the code within the code-block is displayed within the document. So in the case when "echo: true", we get both the code displayed, as well as the output that gets returned by the code. - -![](images/16_EchoTRUE.png) - -
- ---- - -By contrast, when "echo: FALSE", we do not have the code displayed, but do get the output of that code being run. - -In daily-practice, "echo: FALSE" gets often used when generating plots that we want to include in the report, without the code that generated them being displayed. - -![](images/17_EchoFALSE.png) - -
- ---- - -### Include - -The next code-chunk argument is include. Unlike echo, which focuses on whether the code is displayed, but still returns the output, include dictates behavior of both the code-block and it's output. Unlike eval however, it will still run the code, which allows it to be available for the next code-chunk that might need it. When we set "include: false", no trace of that code-chunk is present in the document. This is useful when making reports where we do not want to include the code used to generate a particular figure. - -![](images/15_IncludeFALSE.png) - -
- ---- - -By contrast, when we set "include: true", the code block and it's output is once again included within the rendered document. - -![](images/15_IncludeTRUE.png) - -
- ---- - -### Code-Fold - -One of my favorites is "code-fold". When we set it as "code-fold: show", it displays the code, but provides a drop-down arrow that can be closed to compress the code. - -![](images/18_CodeFoldShow.png) - -
- ---- - -In contrast, if we want to make the code-available for those that are interested, but not directly visible, we can set as "code-fold: true" - -![](images/19_CodeFoldTRUE.png) - -
- ---- - - -### Warnings - -Within R, when code is executed, in addition to returning the output, R is capable of returning warnings (when something is not as expected, but not sufficient to elicit an error with a complete stop) or a message (text output that gets displayed, often telling about progress). While these are useful when running code yourself, it can be annoying when generating a report and the 2nd page is a bunch of warning text being displayed. - -For example, when the R package `ggcyto` is loaded via the library call, it will automatically load several other packages, which typically results in these messages being outputted: - -![](images/21_WarningMessageTrue.png) - -
- ---- - -We can therefore set that code-chunk's warning/message arguments to FALSE, therefore silencing the message outputs that would otherwise clutter up our report. - -![](images/20_WarningMessageFalse.png) - -
- ---- - - -## Text Styles - -Quarto primarily uses Markdown for text styling. Consequently, markdown arguments can be used within the text to change how various text appears. - -![](images/22_StylisticElements.png) - -
- ---- - - -For a regular text, *This* single asterisk on each side of a word will italicize. - -![](images/23_Italics.png) - -
- ---- - -When the number of asterisk is doubled, **This** word is bolded. - -![](images/24_Bold.png) - -
- ---- - -When three asterisk are used, ***both*** are applied. - -![](images/25_ItalicBold.png) - -
- ---- - -For an underscore, the [word]{.underline} of interest is surrounded by square brackets "[]", with "{.underline}" adjacent. - - -## Hyperlinks - -You can link to a website by surrounding word of interest in [] and placing the url within () adjacent to it. - -![](images/26_Hyperlinks.png) - -
- ---- - - -## Images - -You can place images by adding the following, as long as the file.path to the image is correctly formatted. In my case, this is why I include images folders within my folders to simplify the copy and paste. - -![](images/27_Images.png) - -
- ---- - - -![](images/28_ImagesArgs.png) - -
- ---- - -# Wrap-up - -We have now briefly looked at various common customizations within a Quarto Markdown Document that can allow us to better document what we are doing, and control whether various code chunk outputs are displayed in the final rendered document. - -In the [next section](/course/00_Homeworks/), we will cover some course logistics by investigate using the Discussions Forums to get community feedback throughout the course, when to use the Issues page, as well as how to open a pull request to submit any completed optional Take-Home problems to get course instructor feedback. - - -# Additional Resources - -[Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) - -[YAML](https://quarto.org/docs/authoring/front-matter.html) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Introduction to Quarto" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/VQNFWzKxgdk?si=Lbg1mbbnhYAqjSyZ) + + + +For screen-shot slides, click [here](/course/00_Quarto/slides.qmd) + +# Background + +In the [previous section](/course/00_Git/index.qmd), we briefly introduced Quarto Markdown Documents (.qmd) while working our way through version control concepts. Since we will be using .qmd files extensively throughout this course, this section will explore how we can build on these concepts to modify these files to create a variety of outputs (ranging from Word documents, pdfs, html webpages). We will also take a look at how to use code-chunk arguments to control what code is run or displayed within. + +# Getting Started + +We will start off by creating a a new .QMD document within our GitPractice repository. As we saw in the [previous section](/course/00_Git/index.qmd), the basic elements include: + +1) A [YAML]() header, that dictates formatting +2) The text body, where we can include documentation +3) Code-block chunks, in which we can write code that can be executed, as well as # comments + +![](images/00_BasicQMD.png) + +
+ +--- + +## Render/Preview + +The preview button, at the upper-left end of the Editor, is used to render/knit a quarto document. This triggers the process by which code-chunks are run, and then the outputs are cobbled together into the file format type designated by the YAML header. + + +![](images/01_Preview.png) + +
+ +--- + +### HTML + +In this case, the YAML header's format argument is set to html. After clicking preview, we can see the various rendering steps appear in the console below. Since no errors occured, the html document was formed succesfully and appears as a file in the left side-bar. Additional, a preview of the document appears in the View tab of the right side-bar, allowing for quick visual inspection. + +![](images/03_Preview.png) + +
+ +--- + +Alternatively, we can render a document via the terminal, by entering "quarto render ", followed by the name of the document. + +![](images/02_Preview.png) + +
+ +--- + +This results similar process as what we saw with the preview button + +![](images/04_Preview.png) + +
+ +--- + +We can also open the .html document via our File Explorer, which will open it within our web browser. + +![](images/05_HTML.png) + +
+ +--- + +Quarto documents can be rendered (previewed) in other formats besides html. These include pdf, Word documents (docx), and slides (revealjs). This is set by the format argument within the YAML header. + +### PDF + +By switching the format argument from html to pdf, we can render the document as a pdf + +![](images/06_PDF.png) + +
+ +--- + +We can see the pdf is now listed in the list of files, with a preview shown on the right side-bar. + +![](images/06_PDFOutput.png) + +
+ +--- + +### Docx + +We can also generate Word documents (.docx) as well. + +![](images/07_Docx.png) + +
+ +--- + +In this case, we can see that a Word document file was created, but nothing appears in the View tab. This is because the format is not yet supported for the View tab. We can however open and view the Word document via our File explorer. + +![](images/07_DocxRender.png) + +
+ +--- + +Which shows a Word Document style output. + +![](images/07_DocxOutput.png) + +
+ +--- + +## YAML + +We can additionally provide additional custom inputs to the YAML header. A couple examples include providing the document author and date. + +![](images/08_Yaml.png) + +
+ +--- + +Which we can see are updated after we preview/render. + +![](images/08_Yaml2.png) + +
+ +--- + + +## Table of Contents + +In the previous section, we saw that we could provide headings and subheadings to our .qmd file by placing a \# at the start of a line in the text portion of the document. A subheading was designated by a \#\#, with additional hierarchy being designated by appending an additional \#. + + +![](images/09_Headers.png) + +
+ +--- + +We can use the heading information to generate a table of contents for our document. To do this, we add a toc argument to the yaml header, and set it to TRUE. +After rendering, it appears on the upper-right side of the document. + +![](images/10_TOC.png) + +
+ +--- + +Notice, that the subheaders do not appear currently within the TOC. + +![](images/11_HeaderSubs.png) + +
+ +--- + +We can fix this by setting a toc-expand argument in the YAML to true. + +![](images/12_TOCexpanded.png) + +
+ +--- + + +## Code Chunk Arguments + +As we briefly touched on in the [last section](/course/00_Git/index.qmd), code-chunks can be modified by including arguments, which affect whether a particular code chunk gets evaluated. In that example, we included a "#| eval: FALSE" to the install commands since we did not want them to be re-run subsequently. We will take a closer look at the other arguments in this section. + +### Eval + +The code-chunk argument, "Eval", is used to determine when a code-chunk get's evaluated. When set to true (or by default if no eval argument is included), the code-chunks contents will be run/executed, and the output will appear. We can see this in the html output, as below the code block, we get back the address of my working directory. + +![](images/13_EvalTRUE.png) + +
+ +--- + +When we switch the Eval argument to FALSE, and then render the document, we can see that the code block remains, but we do not get any output for the code contained within. + +In every-day practice, we will "use eval: FALSE" arguments when we want to keep the code for later use, but want to manually run the code contained within ourselves. + +![](images/14_EvalFALSE.png) + +
+ +--- + +### Echo + +The code-block argument "echo" dictates whether the code within the code-block is displayed within the document. So in the case when "echo: true", we get both the code displayed, as well as the output that gets returned by the code. + +![](images/16_EchoTRUE.png) + +
+ +--- + +By contrast, when "echo: FALSE", we do not have the code displayed, but do get the output of that code being run. + +In daily-practice, "echo: FALSE" gets often used when generating plots that we want to include in the report, without the code that generated them being displayed. + +![](images/17_EchoFALSE.png) + +
+ +--- + +### Include + +The next code-chunk argument is include. Unlike echo, which focuses on whether the code is displayed, but still returns the output, include dictates behavior of both the code-block and it's output. Unlike eval however, it will still run the code, which allows it to be available for the next code-chunk that might need it. When we set "include: false", no trace of that code-chunk is present in the document. This is useful when making reports where we do not want to include the code used to generate a particular figure. + +![](images/15_IncludeFALSE.png) + +
+ +--- + +By contrast, when we set "include: true", the code block and it's output is once again included within the rendered document. + +![](images/15_IncludeTRUE.png) + +
+ +--- + +### Code-Fold + +One of my favorites is "code-fold". When we set it as "code-fold: show", it displays the code, but provides a drop-down arrow that can be closed to compress the code. + +![](images/18_CodeFoldShow.png) + +
+ +--- + +In contrast, if we want to make the code-available for those that are interested, but not directly visible, we can set as "code-fold: true" + +![](images/19_CodeFoldTRUE.png) + +
+ +--- + + +### Warnings + +Within R, when code is executed, in addition to returning the output, R is capable of returning warnings (when something is not as expected, but not sufficient to elicit an error with a complete stop) or a message (text output that gets displayed, often telling about progress). While these are useful when running code yourself, it can be annoying when generating a report and the 2nd page is a bunch of warning text being displayed. + +For example, when the R package `ggcyto` is loaded via the library call, it will automatically load several other packages, which typically results in these messages being outputted: + +![](images/21_WarningMessageTrue.png) + +
+ +--- + +We can therefore set that code-chunk's warning/message arguments to FALSE, therefore silencing the message outputs that would otherwise clutter up our report. + +![](images/20_WarningMessageFalse.png) + +
+ +--- + + +## Text Styles + +Quarto primarily uses Markdown for text styling. Consequently, markdown arguments can be used within the text to change how various text appears. + +![](images/22_StylisticElements.png) + +
+ +--- + + +For a regular text, *This* single asterisk on each side of a word will italicize. + +![](images/23_Italics.png) + +
+ +--- + +When the number of asterisk is doubled, **This** word is bolded. + +![](images/24_Bold.png) + +
+ +--- + +When three asterisk are used, ***both*** are applied. + +![](images/25_ItalicBold.png) + +
+ +--- + +For an underscore, the [word]{.underline} of interest is surrounded by square brackets "[]", with "{.underline}" adjacent. + + +## Hyperlinks + +You can link to a website by surrounding word of interest in [] and placing the url within () adjacent to it. + +![](images/26_Hyperlinks.png) + +
+ +--- + + +## Images + +You can place images by adding the following, as long as the file.path to the image is correctly formatted. In my case, this is why I include images folders within my folders to simplify the copy and paste. + +![](images/27_Images.png) + +
+ +--- + + +![](images/28_ImagesArgs.png) + +
+ +--- + +# Wrap-up + +We have now briefly looked at various common customizations within a Quarto Markdown Document that can allow us to better document what we are doing, and control whether various code chunk outputs are displayed in the final rendered document. + +In the [next section](/course/00_Homeworks/), we will cover some course logistics by investigate using the Discussions Forums to get community feedback throughout the course, when to use the Issues page, as well as how to open a pull request to submit any completed optional Take-Home problems to get course instructor feedback. + + +# Additional Resources + +[Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) + +[YAML](https://quarto.org/docs/authoring/front-matter.html) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_Quarto/slides.qmd b/course/00_Quarto/slides.qmd index daca079..0c3e888 100644 --- a/course/00_Quarto/slides.qmd +++ b/course/00_Quarto/slides.qmd @@ -1,519 +1,519 @@ ---- -title: "Introduction to Quarto" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -# Background - - -::: {.fragment} -::: {.callout-tip title="."} -In the [previous section](/course/00_Git/index.qmd), we briefly introduced Quarto Markdown Documents (.qmd) while working our way through version control concepts. Since we will be using .qmd files extensively throughout this course, this section will explore how we can build on these concepts to modify these files to create a variety of outputs (ranging from Word documents, pdfs, html webpages). We will also take a look at how to use code-chunk arguments to control what code is run or displayed within. -::: -::: - -# Getting Started - -::: {.fragment} -::: {.callout-tip title="."} -We will start off by creating a a new .QMD document within our GitPractice repository. As we saw in the [previous section](/course/00_Git/index.qmd), the basic elements include: - -1) A [YAML]() header, that dictates formatting -2) The text body, where we can include documentation -3) Code-block chunks, in which we can write code that can be executed, as well as # comments - -::: -::: - ---- - -![](images/00_BasicQMD.png) - ---- - -## Render/Preview - -::: {.fragment} -::: {.callout-tip title="."} -The preview button, at the upper-left end of the Editor, is used to render/knit a quarto document. This triggers the process by which code-chunks are run, and then the outputs are cobbled together into the file format type designated by the YAML header. -::: -::: - ---- - -![](images/01_Preview.png) - ---- - -### HTML - -::: {.fragment} -::: {.callout-tip title="."} -In this case, the YAML header's format argument is set to html. After clicking preview, we can see the various rendering steps appear in the console below. Since no errors occured, the html document was formed succesfully and appears as a file in the left side-bar. Additional, a preview of the document appears in the View tab of the right side-bar, allowing for quick visual inspection. -::: -::: - ---- - - -![](images/03_Preview.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, we can render a document via the terminal, by entering "quarto render ", followed by the name of the document. -::: -::: - ---- - -![](images/02_Preview.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This results similar process as what we saw with the preview button -::: -::: - ---- - -![](images/04_Preview.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can also open the .html document via our File Explorer, which will open it within our web browser. -::: -::: - ---- - -![](images/05_HTML.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Quarto documents can be rendered (previewed) in other formats besides html. These include pdf, Word documents (docx), and slides (revealjs). This is set by the format argument within the YAML header. -::: -::: - -### PDF - -::: {.fragment} -::: {.callout-tip title="."} -By switching the format argument from html to pdf, we can render the document as a pdf -::: -::: - ---- - -![](images/06_PDF.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can see the pdf is now listed in the list of files, with a preview shown on the right side-bar. -::: -::: - ---- - -![](images/06_PDFOutput.png) - ---- - -### Docx - -::: {.fragment} -::: {.callout-tip title="."} -We can also generate Word documents (.docx) as well. -::: -::: - ---- - -![](images/07_Docx.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, we can see that a Word document file was created, but nothing appears in the View tab. This is because the format is not yet supported for the View tab. We can however open and view the Word document via our File explorer. -::: -::: - ---- - -![](images/07_DocxRender.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Which shows a Word Document style output. -::: -::: - ---- - -![](images/07_DocxOutput.png) - ---- - -## YAML - -::: {.fragment} -::: {.callout-tip title="."} -We can additionally provide additional custom inputs to the YAML header. A couple examples include providing the document author and date. -::: -::: - ---- - -![](images/08_Yaml.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Which we can see are updated after we preview/render. -::: -::: - ---- - -![](images/08_Yaml2.png) - ---- - - -## Table of Contents - -::: {.fragment} -::: {.callout-tip title="."} -In the previous section, we saw that we could provide headings and subheadings to our .qmd file by placing a \# at the start of a line in the text portion of the document. A subheading was designated by a \#\#, with additional hierarchy being designated by appending an additional \#. -::: -::: - ---- - -![](images/09_Headers.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can use the heading information to generate a table of contents for our document. To do this, we add a toc argument to the yaml header, and set it to TRUE. -After rendering, it appears on the upper-right side of the document. -::: -::: - ---- - -![](images/10_TOC.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Notice, that the subheaders do not appear currently within the TOC. -::: -::: - ---- - -![](images/11_HeaderSubs.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can fix this by setting a toc-expand argument in the YAML to true. -::: -::: - ---- - -![](images/12_TOCexpanded.png) - ---- - - -## Code Chunk Arguments - -::: {.fragment} -::: {.callout-tip title="."} -As we briefly touched on in the [last section](/course/00_Git/index.qmd), code-chunks can be modified by including arguments, which affect whether a particular code chunk gets evaluated. In that example, we included a "#| eval: FALSE" to the install commands since we did not want them to be re-run subsequently. We will take a closer look at the other arguments in this section. -::: -::: - -### Eval - -::: {.fragment} -::: {.callout-tip title="."} -The code-chunk argument, "Eval", is used to determine when a code-chunk get's evaluated. When set to true (or by default if no eval argument is included), the code-chunks contents will be run/executed, and the output will appear. We can see this in the html output, as below the code block, we get back the address of my working directory. -::: -::: - ---- - -![](images/13_EvalTRUE.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When we switch the Eval argument to FALSE, and then render the document, we can see that the code block remains, but we do not get any output for the code contained within. - -In every-day practice, we will "use eval: FALSE" arguments when we want to keep the code for later use, but want to manually run the code contained within ourselves. -::: -::: - ---- - -![](images/14_EvalFALSE.png) - ---- - -### Echo - -::: {.fragment} -::: {.callout-tip title="."} -The code-block argument "echo" dictates whether the code within the code-block is displayed within the document. So in the case when "echo: true", we get both the code displayed, as well as the output that gets returned by the code. -::: -::: - ---- - -![](images/16_EchoTRUE.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, when "echo: FALSE", we do not have the code displayed, but do get the output of that code being run. - -In daily-practice, "echo: FALSE" gets often used when generating plots that we want to include in the report, without the code that generated them being displayed. -::: -::: - ---- - -![](images/17_EchoFALSE.png) - ---- - -### Include - -::: {.fragment} -::: {.callout-tip title="."} -The next code-chunk argument is include. Unlike echo, which focuses on whether the code is displayed, but still returns the output, include dictates behavior of both the code-block and it's output. Unlike eval however, it will still run the code, which allows it to be available for the next code-chunk that might need it. When we set "include: false", no trace of that code-chunk is present in the document. This is useful when making reports where we do not want to include the code used to generate a particular figure. -::: -::: - ---- - -![](images/15_IncludeFALSE.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, when we set "include: true", the code block and it's output is once again included within the rendered document. -::: -::: - ---- - -![](images/15_IncludeTRUE.png) - ---- - -### Code-Fold - -::: {.fragment} -::: {.callout-tip title="."} -One of my favorites is "code-fold". When we set it as "code-fold: show", it displays the code, but provides a drop-down arrow that can be closed to compress the code. -::: -::: - ---- - -![](images/18_CodeFoldShow.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In contrast, if we want to make the code-available for those that are interested, but not directly visible, we can set as "code-fold: true" -::: -::: - ---- - -![](images/19_CodeFoldTRUE.png) - ---- - -### Warnings - -::: {.fragment} -::: {.callout-tip title="."} -Within R, when code is executed, in addition to returning the output, R is capable of returning warnings (when something is not as expected, but not sufficient to elicit an error with a complete stop) or a message (text output that gets displayed, often telling about progress). While these are useful when running code yourself, it can be annoying when generating a report and the 2nd page is a bunch of warning text being displayed. - -For example, when the R package `ggcyto` is loaded via the library call, it will automatically load several other packages, which typically results in these messages being outputted: -::: -::: - ---- - -![](images/21_WarningMessageTrue.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can therefore set that code-chunk's warning/message arguments to FALSE, therefore silencing the message outputs that would otherwise clutter up our report. -::: -::: - ---- - -![](images/20_WarningMessageFalse.png) - ---- - - -## Text Styles - -::: {.fragment} -::: {.callout-tip title="."} -Quarto primarily uses Markdown for text styling. Consequently, markdown arguments can be used within the text to change how various text appears. -::: -::: - ---- - -![](images/22_StylisticElements.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For a regular text, *This* single asterisk on each side of a word will italicize. -::: -::: - ---- - -![](images/23_Italics.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When the number of asterisk is doubled, **This** word is bolded. -::: -::: - ---- - -![](images/24_Bold.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When three asterisk are used, ***both*** are applied. -::: -::: - ---- - -![](images/25_ItalicBold.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For an underscore, the [word]{.underline} of interest is surrounded by square brackets "[]", with "{.underline}" adjacent. -::: -::: - -## Hyperlinks - -::: {.fragment} -::: {.callout-tip title="."} -You can link to a website by surrounding word of interest in [] and placing the url within () adjacent to it. -::: -::: - ---- - -![](images/26_Hyperlinks.png) - ---- - - -## Images - -::: {.fragment} -::: {.callout-tip title="."} -You can place images by adding the following, as long as the file.path to the image is correctly formatted. In my case, this is why I include images folders within my folders to simplify the copy and paste. -::: -::: - ---- - -![](images/27_Images.png) - ---- - -![](images/28_ImagesArgs.png) - ---- - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -We have now briefly looked at various common customizations within a Quarto Markdown Document that can allow us to better document what we are doing, and control whether various code chunk outputs are displayed in the final rendered document. - -In the [next section](/course/00_Homeworks/), we will cover some course logistics by investigate using the Discussions Forums to get community feedback throughout the course, when to use the Issues page, as well as how to open a pull request to submit any completed optional Take-Home problems to get course instructor feedback. -::: -::: - -# Additional Resources - -[Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) - -[YAML](https://quarto.org/docs/authoring/front-matter.html) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Introduction to Quarto" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +# Background + + +::: {.fragment} +::: {.callout-tip title="."} +In the [previous section](/course/00_Git/index.qmd), we briefly introduced Quarto Markdown Documents (.qmd) while working our way through version control concepts. Since we will be using .qmd files extensively throughout this course, this section will explore how we can build on these concepts to modify these files to create a variety of outputs (ranging from Word documents, pdfs, html webpages). We will also take a look at how to use code-chunk arguments to control what code is run or displayed within. +::: +::: + +# Getting Started + +::: {.fragment} +::: {.callout-tip title="."} +We will start off by creating a a new .QMD document within our GitPractice repository. As we saw in the [previous section](/course/00_Git/index.qmd), the basic elements include: + +1) A [YAML]() header, that dictates formatting +2) The text body, where we can include documentation +3) Code-block chunks, in which we can write code that can be executed, as well as # comments + +::: +::: + +--- + +![](images/00_BasicQMD.png) + +--- + +## Render/Preview + +::: {.fragment} +::: {.callout-tip title="."} +The preview button, at the upper-left end of the Editor, is used to render/knit a quarto document. This triggers the process by which code-chunks are run, and then the outputs are cobbled together into the file format type designated by the YAML header. +::: +::: + +--- + +![](images/01_Preview.png) + +--- + +### HTML + +::: {.fragment} +::: {.callout-tip title="."} +In this case, the YAML header's format argument is set to html. After clicking preview, we can see the various rendering steps appear in the console below. Since no errors occured, the html document was formed succesfully and appears as a file in the left side-bar. Additional, a preview of the document appears in the View tab of the right side-bar, allowing for quick visual inspection. +::: +::: + +--- + + +![](images/03_Preview.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we can render a document via the terminal, by entering "quarto render ", followed by the name of the document. +::: +::: + +--- + +![](images/02_Preview.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This results similar process as what we saw with the preview button +::: +::: + +--- + +![](images/04_Preview.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also open the .html document via our File Explorer, which will open it within our web browser. +::: +::: + +--- + +![](images/05_HTML.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Quarto documents can be rendered (previewed) in other formats besides html. These include pdf, Word documents (docx), and slides (revealjs). This is set by the format argument within the YAML header. +::: +::: + +### PDF + +::: {.fragment} +::: {.callout-tip title="."} +By switching the format argument from html to pdf, we can render the document as a pdf +::: +::: + +--- + +![](images/06_PDF.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can see the pdf is now listed in the list of files, with a preview shown on the right side-bar. +::: +::: + +--- + +![](images/06_PDFOutput.png) + +--- + +### Docx + +::: {.fragment} +::: {.callout-tip title="."} +We can also generate Word documents (.docx) as well. +::: +::: + +--- + +![](images/07_Docx.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, we can see that a Word document file was created, but nothing appears in the View tab. This is because the format is not yet supported for the View tab. We can however open and view the Word document via our File explorer. +::: +::: + +--- + +![](images/07_DocxRender.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which shows a Word Document style output. +::: +::: + +--- + +![](images/07_DocxOutput.png) + +--- + +## YAML + +::: {.fragment} +::: {.callout-tip title="."} +We can additionally provide additional custom inputs to the YAML header. A couple examples include providing the document author and date. +::: +::: + +--- + +![](images/08_Yaml.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which we can see are updated after we preview/render. +::: +::: + +--- + +![](images/08_Yaml2.png) + +--- + + +## Table of Contents + +::: {.fragment} +::: {.callout-tip title="."} +In the previous section, we saw that we could provide headings and subheadings to our .qmd file by placing a \# at the start of a line in the text portion of the document. A subheading was designated by a \#\#, with additional hierarchy being designated by appending an additional \#. +::: +::: + +--- + +![](images/09_Headers.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can use the heading information to generate a table of contents for our document. To do this, we add a toc argument to the yaml header, and set it to TRUE. +After rendering, it appears on the upper-right side of the document. +::: +::: + +--- + +![](images/10_TOC.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Notice, that the subheaders do not appear currently within the TOC. +::: +::: + +--- + +![](images/11_HeaderSubs.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can fix this by setting a toc-expand argument in the YAML to true. +::: +::: + +--- + +![](images/12_TOCexpanded.png) + +--- + + +## Code Chunk Arguments + +::: {.fragment} +::: {.callout-tip title="."} +As we briefly touched on in the [last section](/course/00_Git/index.qmd), code-chunks can be modified by including arguments, which affect whether a particular code chunk gets evaluated. In that example, we included a "#| eval: FALSE" to the install commands since we did not want them to be re-run subsequently. We will take a closer look at the other arguments in this section. +::: +::: + +### Eval + +::: {.fragment} +::: {.callout-tip title="."} +The code-chunk argument, "Eval", is used to determine when a code-chunk get's evaluated. When set to true (or by default if no eval argument is included), the code-chunks contents will be run/executed, and the output will appear. We can see this in the html output, as below the code block, we get back the address of my working directory. +::: +::: + +--- + +![](images/13_EvalTRUE.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When we switch the Eval argument to FALSE, and then render the document, we can see that the code block remains, but we do not get any output for the code contained within. + +In every-day practice, we will "use eval: FALSE" arguments when we want to keep the code for later use, but want to manually run the code contained within ourselves. +::: +::: + +--- + +![](images/14_EvalFALSE.png) + +--- + +### Echo + +::: {.fragment} +::: {.callout-tip title="."} +The code-block argument "echo" dictates whether the code within the code-block is displayed within the document. So in the case when "echo: true", we get both the code displayed, as well as the output that gets returned by the code. +::: +::: + +--- + +![](images/16_EchoTRUE.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, when "echo: FALSE", we do not have the code displayed, but do get the output of that code being run. + +In daily-practice, "echo: FALSE" gets often used when generating plots that we want to include in the report, without the code that generated them being displayed. +::: +::: + +--- + +![](images/17_EchoFALSE.png) + +--- + +### Include + +::: {.fragment} +::: {.callout-tip title="."} +The next code-chunk argument is include. Unlike echo, which focuses on whether the code is displayed, but still returns the output, include dictates behavior of both the code-block and it's output. Unlike eval however, it will still run the code, which allows it to be available for the next code-chunk that might need it. When we set "include: false", no trace of that code-chunk is present in the document. This is useful when making reports where we do not want to include the code used to generate a particular figure. +::: +::: + +--- + +![](images/15_IncludeFALSE.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, when we set "include: true", the code block and it's output is once again included within the rendered document. +::: +::: + +--- + +![](images/15_IncludeTRUE.png) + +--- + +### Code-Fold + +::: {.fragment} +::: {.callout-tip title="."} +One of my favorites is "code-fold". When we set it as "code-fold: show", it displays the code, but provides a drop-down arrow that can be closed to compress the code. +::: +::: + +--- + +![](images/18_CodeFoldShow.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In contrast, if we want to make the code-available for those that are interested, but not directly visible, we can set as "code-fold: true" +::: +::: + +--- + +![](images/19_CodeFoldTRUE.png) + +--- + +### Warnings + +::: {.fragment} +::: {.callout-tip title="."} +Within R, when code is executed, in addition to returning the output, R is capable of returning warnings (when something is not as expected, but not sufficient to elicit an error with a complete stop) or a message (text output that gets displayed, often telling about progress). While these are useful when running code yourself, it can be annoying when generating a report and the 2nd page is a bunch of warning text being displayed. + +For example, when the R package `ggcyto` is loaded via the library call, it will automatically load several other packages, which typically results in these messages being outputted: +::: +::: + +--- + +![](images/21_WarningMessageTrue.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can therefore set that code-chunk's warning/message arguments to FALSE, therefore silencing the message outputs that would otherwise clutter up our report. +::: +::: + +--- + +![](images/20_WarningMessageFalse.png) + +--- + + +## Text Styles + +::: {.fragment} +::: {.callout-tip title="."} +Quarto primarily uses Markdown for text styling. Consequently, markdown arguments can be used within the text to change how various text appears. +::: +::: + +--- + +![](images/22_StylisticElements.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For a regular text, *This* single asterisk on each side of a word will italicize. +::: +::: + +--- + +![](images/23_Italics.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When the number of asterisk is doubled, **This** word is bolded. +::: +::: + +--- + +![](images/24_Bold.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When three asterisk are used, ***both*** are applied. +::: +::: + +--- + +![](images/25_ItalicBold.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For an underscore, the [word]{.underline} of interest is surrounded by square brackets "[]", with "{.underline}" adjacent. +::: +::: + +## Hyperlinks + +::: {.fragment} +::: {.callout-tip title="."} +You can link to a website by surrounding word of interest in [] and placing the url within () adjacent to it. +::: +::: + +--- + +![](images/26_Hyperlinks.png) + +--- + + +## Images + +::: {.fragment} +::: {.callout-tip title="."} +You can place images by adding the following, as long as the file.path to the image is correctly formatted. In my case, this is why I include images folders within my folders to simplify the copy and paste. +::: +::: + +--- + +![](images/27_Images.png) + +--- + +![](images/28_ImagesArgs.png) + +--- + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +We have now briefly looked at various common customizations within a Quarto Markdown Document that can allow us to better document what we are doing, and control whether various code chunk outputs are displayed in the final rendered document. + +In the [next section](/course/00_Homeworks/), we will cover some course logistics by investigate using the Discussions Forums to get community feedback throughout the course, when to use the Issues page, as well as how to open a pull request to submit any completed optional Take-Home problems to get course instructor feedback. +::: +::: + +# Additional Resources + +[Quarto Markdown](https://quarto.org/docs/authoring/markdown-basics.html#overview) + +[YAML](https://quarto.org/docs/authoring/front-matter.html) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/.DS_Store b/course/00_WorkstationSetup/.DS_Store deleted file mode 100644 index c77a9d1..0000000 Binary files a/course/00_WorkstationSetup/.DS_Store and /dev/null differ diff --git a/course/00_WorkstationSetup/Linux.qmd b/course/00_WorkstationSetup/Linux.qmd index 57da3a0..fba2538 100644 --- a/course/00_WorkstationSetup/Linux.qmd +++ b/course/00_WorkstationSetup/Linux.qmd @@ -1,413 +1,413 @@ ---- -title: "Installing Software on Linux" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/xZtvnQ6OsWM?si=1Vo-ajnf33HHHePJ) - - - -For screen-shot slides, click [here](/course/00_WorkstationSetup/LinuxSlides.qmd) - -This is the software installation walkthrough for those whose computers are running Linux. First off, welcome! Based on our pre-course interest form, there was a suprising number of you daily-drivers out there! However, a CytometryInR interest form is unlikely to be representative of the general population, so please stash all Year of the Linux desktop banners until further notice. - -![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} - -
- ---- - -# Background - -If you are daily-driving Linux, you are likely not a stranger to the process of getting software installed on your particular distribution. - -When it comes to installing [R website](https://www.r-project.org/), the R project supports packaging formats for both Debian (including Ubuntu, Linux Mint, etc) and RHEL (including Fedora) based-distributions. The supported branch for SUSE has not been active since 2012. This is similarly the case when installing [Positron](https://positron.posit.co/). Depending on your distribution, you might also need to install [Git](https://git-scm.com/) via your package manager. - -I daily-drive Debian stable (Trixie), so this walk-through documents the installation process for the Debian branch. I plan to circle back with a Fedora version, but if that doesn't occur by the publishing time, I refer you to the R for Linux [documentation](https://cran.r-project.org/bin/linux/fedora/#fedora) to help get you started. - -
- ---- - -# Getting Started - -## Debian-based Distros - -### Installing R - -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. - -![](images/Linux/01_RLanding.png) - -
- ---- - -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. - -![](images/Linux/02_Mirror.png) - -
- ---- - -Once this is done, select your Linux Distro (or one that shares your package managers format). - -![](images/Linux/03_Debian.png) - -
- ---- - -On the landing page, you will find a bunch of relevant installation information, which is worthwhile giving a read-through when you have time. - -![](images/Linux/04_Landing.png) - -
- ---- - -The process to successfully install R can be summarized as follows: - -Update apt/sources.list to include the CRAN repository (allowing access to R packages) - -![](images/Linux/08_AptSources.png) - -
- ---- - -Since we are running on Debian stable (Trixie), we would add the following line to sources.list - -![](images/Linux/07_TrixieRepo.png) - -
- ---- - -So in practice, open sources.list: - -![](images/Linux/09_EditAptSources.png) - -
- ---- - -Paste the line, and "Ctrl + O"; "Enter"; "Ctrl + X" to save the changes. - -![](images/Linux/10_UpdatedEditAptSources.png) - -
- ---- - -Next, we will need to retrieve the keyID used to sign. This can be fetched from Ubuntu via the terminal. - -![](images/Linux/06_SecureAptKey.png) - -
- ---- - -![](images/Linux/12_AptKey.png) - -
- ---- - -Then we need to export and write it - -![](images/Linux/12_AptKey2.png) - -
- ---- - -Which if successful, will display the public key. - -![](images/Linux/12_PublicKey.png) - -
- ---- - -With the above set up, we can proceed via our apt package manager to install both r-base and r-base-dev (which contains the equivalent of Rtools for Windows, or Xcode Command Line Tools for macOS). - -![](images/Linux/05_BaseR.png) - -
- ---- - -![](images/Linux/13_InstallBaseAndDev.png) - -
- ---- - -![](images/Linux/13_Install.png) - -
- ---- - -And if all goes well, R should now be installed. - -## Installing Git - -```{r} -# sudo apt install git -``` - -## Installing Positron - -Finally, you will need to install [Positron](https://positron.posit.co/). It will be the integrated development environment (IDE) we will be using for the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. - -![](images/Windows/25_Positron.png) - -
- ---- - -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). - -![](images/Linux/15_TermsService.png) - - -
- ---- - -With the license accepted, you will be able to select distribution and architecture. - -![](images/Linux/16_LinuxFlavor.png) - -
- ---- - -Once the Download completes, proceed to install the .deb package as you would nornally. GUI example via Discover below. - -![](images/Linux/17_DebPackageInstall.png) - -
- ---- - -Depending on your configurations, you may be asked to exert your sudo powers. - -![](images/Linux/18_Password.png) - -
- ---- - -Once this completes, you should now be able to launch the software for the first time. - -![](images/Linux/19_InstallSuccess.png) - -
- ---- - -# Connecting GitHub and Positron - -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: - -![](images/Linux/20_PositronStart.png) - -
- ---- - -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right. - - -![](images/Linux/20_PositronStart.png) - -
- ---- - -Then select the most recent/up-to-date R version. - -![](images/Linux/21_R.png) - -
- ---- - -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) - -![](images/Linux/22_RSuccess.png) - -
- ---- - -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. - - -![](images/Linux/23_GitHub.png) - -
- ---- - -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. - -![](images/Linux/24_Code.png) - -
- ---- - -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. - - -![](images/Linux/25_GitHubAccount.png) - -
- ---- - -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. - -![](images/Linux/26_EnterNumber.png) - -
- ---- - -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. - -![](images/Linux/27_Confirm.png) - -
- ---- - -And if all works out, you should see the following succes page - -![](images/Linux/28_ConfirmationPage.png) - -
- ---- - -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. - -![](images/Linux/29_PositronSuccess.png) - -
- ---- - -# New Folder from Git - -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option - -![](images/MacOS/24.png) - -
- ---- - -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" - -![](images/FolderFromGit1.png) - -
- ---- - -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. - -![](images/Import2.png) - -
- ---- - -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. - -![](images/MacOS/28.png) - -
- ---- - -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. - -![](images/Import2Done.png) - -
- ---- - -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" - -![](images/FolderFromGit2.png) - -
- ---- - -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. - -![](images/Import2.png) - -
- ---- - -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. - -![](images/Import2Done.png) - -
- ---- - -# Wrap-up - -In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. - -
- ---- - -# Additional Resources - -[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on Linux" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/xZtvnQ6OsWM?si=1Vo-ajnf33HHHePJ) + + + +For screen-shot slides, click [here](/course/00_WorkstationSetup/LinuxSlides.qmd) + +This is the software installation walkthrough for those whose computers are running Linux. First off, welcome! Based on our pre-course interest form, there was a suprising number of you daily-drivers out there! However, a CytometryInR interest form is unlikely to be representative of the general population, so please stash all Year of the Linux desktop banners until further notice. + +![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} + +
+ +--- + +# Background + +If you are daily-driving Linux, you are likely not a stranger to the process of getting software installed on your particular distribution. + +When it comes to installing [R website](https://www.r-project.org/), the R project supports packaging formats for both Debian (including Ubuntu, Linux Mint, etc) and RHEL (including Fedora) based-distributions. The supported branch for SUSE has not been active since 2012. This is similarly the case when installing [Positron](https://positron.posit.co/). Depending on your distribution, you might also need to install [Git](https://git-scm.com/) via your package manager. + +I daily-drive Debian stable (Trixie), so this walk-through documents the installation process for the Debian branch. I plan to circle back with a Fedora version, but if that doesn't occur by the publishing time, I refer you to the R for Linux [documentation](https://cran.r-project.org/bin/linux/fedora/#fedora) to help get you started. + +
+ +--- + +# Getting Started + +## Debian-based Distros + +### Installing R + +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. + +![](images/Linux/01_RLanding.png) + +
+ +--- + +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. + +![](images/Linux/02_Mirror.png) + +
+ +--- + +Once this is done, select your Linux Distro (or one that shares your package managers format). + +![](images/Linux/03_Debian.png) + +
+ +--- + +On the landing page, you will find a bunch of relevant installation information, which is worthwhile giving a read-through when you have time. + +![](images/Linux/04_Landing.png) + +
+ +--- + +The process to successfully install R can be summarized as follows: + +Update apt/sources.list to include the CRAN repository (allowing access to R packages) + +![](images/Linux/08_AptSources.png) + +
+ +--- + +Since we are running on Debian stable (Trixie), we would add the following line to sources.list + +![](images/Linux/07_TrixieRepo.png) + +
+ +--- + +So in practice, open sources.list: + +![](images/Linux/09_EditAptSources.png) + +
+ +--- + +Paste the line, and "Ctrl + O"; "Enter"; "Ctrl + X" to save the changes. + +![](images/Linux/10_UpdatedEditAptSources.png) + +
+ +--- + +Next, we will need to retrieve the keyID used to sign. This can be fetched from Ubuntu via the terminal. + +![](images/Linux/06_SecureAptKey.png) + +
+ +--- + +![](images/Linux/12_AptKey.png) + +
+ +--- + +Then we need to export and write it + +![](images/Linux/12_AptKey2.png) + +
+ +--- + +Which if successful, will display the public key. + +![](images/Linux/12_PublicKey.png) + +
+ +--- + +With the above set up, we can proceed via our apt package manager to install both r-base and r-base-dev (which contains the equivalent of Rtools for Windows, or Xcode Command Line Tools for macOS). + +![](images/Linux/05_BaseR.png) + +
+ +--- + +![](images/Linux/13_InstallBaseAndDev.png) + +
+ +--- + +![](images/Linux/13_Install.png) + +
+ +--- + +And if all goes well, R should now be installed. + +## Installing Git + +```{r} +# sudo apt install git +``` + +## Installing Positron + +Finally, you will need to install [Positron](https://positron.posit.co/). It will be the integrated development environment (IDE) we will be using for the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. + +![](images/Windows/25_Positron.png) + +
+ +--- + +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). + +![](images/Linux/15_TermsService.png) + + +
+ +--- + +With the license accepted, you will be able to select distribution and architecture. + +![](images/Linux/16_LinuxFlavor.png) + +
+ +--- + +Once the Download completes, proceed to install the .deb package as you would nornally. GUI example via Discover below. + +![](images/Linux/17_DebPackageInstall.png) + +
+ +--- + +Depending on your configurations, you may be asked to exert your sudo powers. + +![](images/Linux/18_Password.png) + +
+ +--- + +Once this completes, you should now be able to launch the software for the first time. + +![](images/Linux/19_InstallSuccess.png) + +
+ +--- + +# Connecting GitHub and Positron + +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: + +![](images/Linux/20_PositronStart.png) + +
+ +--- + +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right. + + +![](images/Linux/20_PositronStart.png) + +
+ +--- + +Then select the most recent/up-to-date R version. + +![](images/Linux/21_R.png) + +
+ +--- + +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) + +![](images/Linux/22_RSuccess.png) + +
+ +--- + +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. + + +![](images/Linux/23_GitHub.png) + +
+ +--- + +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. + +![](images/Linux/24_Code.png) + +
+ +--- + +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. + + +![](images/Linux/25_GitHubAccount.png) + +
+ +--- + +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. + +![](images/Linux/26_EnterNumber.png) + +
+ +--- + +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. + +![](images/Linux/27_Confirm.png) + +
+ +--- + +And if all works out, you should see the following succes page + +![](images/Linux/28_ConfirmationPage.png) + +
+ +--- + +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. + +![](images/Linux/29_PositronSuccess.png) + +
+ +--- + +# New Folder from Git + +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option + +![](images/MacOS/24.png) + +
+ +--- + +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" + +![](images/FolderFromGit1.png) + +
+ +--- + +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. + +![](images/Import2.png) + +
+ +--- + +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. + +![](images/MacOS/28.png) + +
+ +--- + +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. + +![](images/Import2Done.png) + +
+ +--- + +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" + +![](images/FolderFromGit2.png) + +
+ +--- + +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. + +![](images/Import2.png) + +
+ +--- + +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. + +![](images/Import2Done.png) + +
+ +--- + +# Wrap-up + +In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. + +
+ +--- + +# Additional Resources + +[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/LinuxSlides.qmd b/course/00_WorkstationSetup/LinuxSlides.qmd index 77d36af..560601a 100644 --- a/course/00_WorkstationSetup/LinuxSlides.qmd +++ b/course/00_WorkstationSetup/LinuxSlides.qmd @@ -1,568 +1,568 @@ ---- -title: "Installing Software on Linux" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -For screen-shot slide format, click [here](/course/00_WorkstationSetup/LinuxSlides.qmd) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -::: {.fragment} -::: {.callout-tip title="."} - -This is the software installation walkthrough for those whose computers are running Linux. First off, welcome! Based on our pre-course interest form, there was a suprising number of you daily-drivers out there! However, a CytometryInR interest form is unlikely to be representative of the general population, so please stash all Year of the Linux desktop banners until further notice. -::: -::: - ---- - -![](/course/00_WorkstationSetup/images/ComputerOS.png) - ---- - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -If you are daily-driving Linux, you are likely not a stranger to the process of getting software installed on your particular distribution. - -When it comes to installing [R website](https://www.r-project.org/), the R project supports packaging formats for both Debian (including Ubuntu, Linux Mint, etc) and RHEL (including Fedora) based-distributions. The supported branch for SUSE has not been active since 2012. This is similarly the case when installing [Positron](https://positron.posit.co/). Depending on your distribution, you might also need to install [Git](https://git-scm.com/) via your package manager. - -I daily-drive Debian stable (Trixie), so this walk-through documents the installation process for the Debian branch. I plan to circle back with a Fedora version, but if that doesn't occur by the publishing time, I refer you to the R for Linux [documentation](https://cran.r-project.org/bin/linux/fedora/#fedora) to help get you started. -::: -::: - ---- - -# Getting Started - -## Debian-based Distros - -### Installing R - -::: {.fragment} -::: {.callout-tip title="."} -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. -::: -::: - ---- - -![](images/Linux/01_RLanding.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. -::: -::: - ---- - -![](images/Linux/02_Mirror.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, select your Linux Distro (or one that shares your package managers format). -::: -::: - ---- - -![](images/Linux/03_Debian.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the landing page, you will find a bunch of relevant installation information, which is worthwhile giving a read-through when you have time. -::: -::: - ---- - -![](images/Linux/04_Landing.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The process to successfully install R can be summarized as follows: - -Update apt/sources.list to include the CRAN repository (allowing access to R packages) -::: -::: - ---- - -![](images/Linux/08_AptSources.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Since we are running on Debian stable (Trixie), we would add the following line to sources.list -::: -::: - ---- - -![](images/Linux/07_TrixieRepo.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -So in practice, open sources.list: -::: -::: - ---- - -![](images/Linux/09_EditAptSources.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Paste the line, and "Ctrl + O"; "Enter"; "Ctrl + X" to save the changes. -::: -::: - ---- - -![](images/Linux/10_UpdatedEditAptSources.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, we will need to retrieve the keyID used to sign. This can be fetched from Ubuntu via the terminal. -::: -::: - ---- - -![](images/Linux/06_SecureAptKey.png) - ---- - -![](images/Linux/12_AptKey.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Then we need to export and write it -::: -::: - ---- - -![](images/Linux/12_AptKey2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Which if successful, will display the public key. -::: -::: - ---- - -![](images/Linux/12_PublicKey.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With the above set up, we can proceed via our apt package manager to install both r-base and r-base-dev (which contains the equivalent of Rtools for Windows, or Xcode Command Line Tools for macOS). -::: -::: - ---- - -![](images/Linux/05_BaseR.png) - ---- - -![](images/Linux/13_InstallBaseAndDev.png) - ---- - -![](images/Linux/13_Install.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all goes well, R should now be installed. -::: -::: - -## Installing Git - -```{r} -# sudo apt install git -``` - -## Installing Positron - -::: {.fragment} -::: {.callout-tip title="."} -Finally, you will need to install [Positron](https://positron.posit.co/). It will be the integrated development environment (IDE) we will be using for the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. -::: -::: - ---- - -![](images/Windows/25_Positron.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). -::: -::: - ---- - -![](images/Linux/15_TermsService.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With the license accepted, you will be able to select distribution and architecture. -::: -::: - ---- - -![](images/Linux/16_LinuxFlavor.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once the Download completes, proceed to install the .deb package as you would nornally. GUI example via Discover below. -::: -::: - ---- - -![](images/Linux/17_DebPackageInstall.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Depending on your configurations, you may be asked to exert your sudo powers. -::: -::: - ---- - -![](images/Linux/18_Password.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once this completes, you should now be able to launch the software for the first time. -::: -::: - ---- - -![](images/Linux/19_InstallSuccess.png) - ---- - -# Connecting GitHub and Positron - -::: {.fragment} -::: {.callout-tip title="."} -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: -::: -::: - ---- - -![](images/Linux/20_PositronStart.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right. -::: -::: - ---- - -![](images/Linux/20_PositronStart.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Then select the most recent/up-to-date R version. -::: -::: - ---- - -![](images/Linux/21_R.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) -::: -::: - ---- - -![](images/Linux/22_RSuccess.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. -::: -::: - ---- - -![](images/Linux/23_GitHub.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. -::: -::: - ---- - -![](images/Linux/24_Code.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. -::: -::: - ---- - -![](images/Linux/25_GitHubAccount.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. -::: -::: - ---- - -![](images/Linux/26_EnterNumber.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. -::: -::: - ---- - -![](images/Linux/27_Confirm.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all works out, you should see the following succes page -::: -::: - ---- - -![](images/Linux/28_ConfirmationPage.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. -::: -::: - ---- - -![](images/Linux/29_PositronSuccess.png) - ---- - -# New Folder from Git - -::: {.fragment} -::: {.callout-tip title="."} -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option -::: -::: - ---- - -![](images/MacOS/24.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" -::: -::: - ---- - -![](images/FolderFromGit1.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. -::: -::: - ---- - -![](images/Import2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. -::: -::: - ---- - -![](images/MacOS/28.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. -::: -::: - ---- - -![](images/Import2Done.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" -::: -::: - ---- - -![](images/FolderFromGit2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. -::: -::: - ---- - -![](images/Import2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. -::: -::: - ---- - -![](images/Import2Done.png) - ---- - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. -::: -::: - ---- - -# Additional Resources - -[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on Linux" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +For screen-shot slide format, click [here](/course/00_WorkstationSetup/LinuxSlides.qmd) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +::: {.fragment} +::: {.callout-tip title="."} + +This is the software installation walkthrough for those whose computers are running Linux. First off, welcome! Based on our pre-course interest form, there was a suprising number of you daily-drivers out there! However, a CytometryInR interest form is unlikely to be representative of the general population, so please stash all Year of the Linux desktop banners until further notice. +::: +::: + +--- + +![](/course/00_WorkstationSetup/images/ComputerOS.png) + +--- + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +If you are daily-driving Linux, you are likely not a stranger to the process of getting software installed on your particular distribution. + +When it comes to installing [R website](https://www.r-project.org/), the R project supports packaging formats for both Debian (including Ubuntu, Linux Mint, etc) and RHEL (including Fedora) based-distributions. The supported branch for SUSE has not been active since 2012. This is similarly the case when installing [Positron](https://positron.posit.co/). Depending on your distribution, you might also need to install [Git](https://git-scm.com/) via your package manager. + +I daily-drive Debian stable (Trixie), so this walk-through documents the installation process for the Debian branch. I plan to circle back with a Fedora version, but if that doesn't occur by the publishing time, I refer you to the R for Linux [documentation](https://cran.r-project.org/bin/linux/fedora/#fedora) to help get you started. +::: +::: + +--- + +# Getting Started + +## Debian-based Distros + +### Installing R + +::: {.fragment} +::: {.callout-tip title="."} +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. +::: +::: + +--- + +![](images/Linux/01_RLanding.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. +::: +::: + +--- + +![](images/Linux/02_Mirror.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, select your Linux Distro (or one that shares your package managers format). +::: +::: + +--- + +![](images/Linux/03_Debian.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the landing page, you will find a bunch of relevant installation information, which is worthwhile giving a read-through when you have time. +::: +::: + +--- + +![](images/Linux/04_Landing.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The process to successfully install R can be summarized as follows: + +Update apt/sources.list to include the CRAN repository (allowing access to R packages) +::: +::: + +--- + +![](images/Linux/08_AptSources.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Since we are running on Debian stable (Trixie), we would add the following line to sources.list +::: +::: + +--- + +![](images/Linux/07_TrixieRepo.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +So in practice, open sources.list: +::: +::: + +--- + +![](images/Linux/09_EditAptSources.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Paste the line, and "Ctrl + O"; "Enter"; "Ctrl + X" to save the changes. +::: +::: + +--- + +![](images/Linux/10_UpdatedEditAptSources.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, we will need to retrieve the keyID used to sign. This can be fetched from Ubuntu via the terminal. +::: +::: + +--- + +![](images/Linux/06_SecureAptKey.png) + +--- + +![](images/Linux/12_AptKey.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then we need to export and write it +::: +::: + +--- + +![](images/Linux/12_AptKey2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which if successful, will display the public key. +::: +::: + +--- + +![](images/Linux/12_PublicKey.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the above set up, we can proceed via our apt package manager to install both r-base and r-base-dev (which contains the equivalent of Rtools for Windows, or Xcode Command Line Tools for macOS). +::: +::: + +--- + +![](images/Linux/05_BaseR.png) + +--- + +![](images/Linux/13_InstallBaseAndDev.png) + +--- + +![](images/Linux/13_Install.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all goes well, R should now be installed. +::: +::: + +## Installing Git + +```{r} +# sudo apt install git +``` + +## Installing Positron + +::: {.fragment} +::: {.callout-tip title="."} +Finally, you will need to install [Positron](https://positron.posit.co/). It will be the integrated development environment (IDE) we will be using for the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. +::: +::: + +--- + +![](images/Windows/25_Positron.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). +::: +::: + +--- + +![](images/Linux/15_TermsService.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the license accepted, you will be able to select distribution and architecture. +::: +::: + +--- + +![](images/Linux/16_LinuxFlavor.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once the Download completes, proceed to install the .deb package as you would nornally. GUI example via Discover below. +::: +::: + +--- + +![](images/Linux/17_DebPackageInstall.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Depending on your configurations, you may be asked to exert your sudo powers. +::: +::: + +--- + +![](images/Linux/18_Password.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this completes, you should now be able to launch the software for the first time. +::: +::: + +--- + +![](images/Linux/19_InstallSuccess.png) + +--- + +# Connecting GitHub and Positron + +::: {.fragment} +::: {.callout-tip title="."} +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: +::: +::: + +--- + +![](images/Linux/20_PositronStart.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right. +::: +::: + +--- + +![](images/Linux/20_PositronStart.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then select the most recent/up-to-date R version. +::: +::: + +--- + +![](images/Linux/21_R.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) +::: +::: + +--- + +![](images/Linux/22_RSuccess.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. +::: +::: + +--- + +![](images/Linux/23_GitHub.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. +::: +::: + +--- + +![](images/Linux/24_Code.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. +::: +::: + +--- + +![](images/Linux/25_GitHubAccount.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. +::: +::: + +--- + +![](images/Linux/26_EnterNumber.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. +::: +::: + +--- + +![](images/Linux/27_Confirm.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all works out, you should see the following succes page +::: +::: + +--- + +![](images/Linux/28_ConfirmationPage.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. +::: +::: + +--- + +![](images/Linux/29_PositronSuccess.png) + +--- + +# New Folder from Git + +::: {.fragment} +::: {.callout-tip title="."} +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option +::: +::: + +--- + +![](images/MacOS/24.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" +::: +::: + +--- + +![](images/FolderFromGit1.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. +::: +::: + +--- + +![](images/Import2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. +::: +::: + +--- + +![](images/MacOS/28.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. +::: +::: + +--- + +![](images/Import2Done.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" +::: +::: + +--- + +![](images/FolderFromGit2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. +::: +::: + +--- + +![](images/Import2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. +::: +::: + +--- + +![](images/Import2Done.png) + +--- + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. +::: +::: + +--- + +# Additional Resources + +[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/MacOS.qmd b/course/00_WorkstationSetup/MacOS.qmd index 18f9c06..e875265 100644 --- a/course/00_WorkstationSetup/MacOS.qmd +++ b/course/00_WorkstationSetup/MacOS.qmd @@ -1,413 +1,413 @@ ---- -title: "Installing Software on MacOS" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/ik395dIsFbc?si=Z90yMpRdzI1XzRPd) - - - -For screen-shot slides, click [here](/course/00_WorkstationSetup/MacOSSlides.qmd) - -This is the software installation walkthrough for those whose computers are running MacOS. Based on our pre-course interest form, you make up a solid proportion of the course participants. - -![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} - -# Background - -In this walkthrough, we will have you install the following pieces of software: - -[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. - -[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. - -[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. You may or may not already it on your computer depending on whether Xcode Command Line Tools is installed. - -Please note, the installation steps detailed below were carried out on a Mac with the older older pre-2020 x86 Intel chips, if you are running a Mac with the newer ARM (M1 or greater) chips, the installation instructions will differ some of the options you selecct during the download. If you encounter major differences in installation, please take screenshots and open an [issue](https://github.com/UMGCCCFCSR/CytometryInR/issues) so that we can update the documentation for your architecture. - -
- ---- - -# Getting Started - -
- ---- - -## Installing R - -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. - -![](images/MacOS/4_RLanding.png) - -
- ---- - -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. - -![](images/MacOS/5_RMirror.png) - -
- ---- - -You will then select your Operating System, in this case, [macOS](https://cloud.r-project.org/bin/macosx/) - - -![](images/MacOS/6_ROS.png) - -
- ---- - -Next, you will need to select the appropiate [download](https://cloud.r-project.org/bin/macosx/) based on your computers architecture. On newer Macs (containing M1+ chips) this would the arm64 option on the center left of the screen. For the older Intel (pre-2020) Macs, you would select the x86_64 option. If you are unsure, check your [About This Mac](https://youtu.be/l3xW84TFeSA?si=i53tL5Ac_rEwEyjn) tab - -![](images/MacOS/7_RMacCPU.png) - -
- ---- - -After the download has completed, launch the installer - -![](images/MacOS/8_RInstall.png) - -
- ---- - -Proceed through the Read Me - -![](images/MacOS/9_RInstall.png) - -
- ---- - -You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). - -![](images/MacOS/10_RInstallLicense.png) - -
- ---- - -![](images/MacOS/11_RInstallLicense.png) - -
- ---- - -Next, you will need to navigate through several pages, keeping the defaults. - -![](images/MacOS/12_RInstall.png) - -
- ---- - -And with any luck, you should see that the installation was successful. - -![](images/MacOS/13_RInstall.png) - -
- ---- - -## Xcode Command Line Tools - -Depending on your version of macOS, you may or may not already have [Git](https://git-scm.com/install/mac) installed on your computer. The reason is that it comes bundled within the Xcode Command Line Tools. - -If this is not your first foray into coding, you may have previously seen an installation pop-up along the lines of "XYZ requires command line developer tools. Would you like to install the tools now?" when installing an IDE (like Positron, Rstudio or Visual Studio Code). - -![](images/MacOS/00_Popup.png) - -
- ---- - -Since these command line developer tools contain both Git, and also the equivalent of Rtools for Windows, we will need to install them for this course. To get started, first open your terminal. - -![](images/MacOS/00_1OpenTerminal.png) - -
- ---- - -Next run the following code: - -```{r} -#| eval: FALSE -xcode-select --install -``` - -![](images/MacOS/00_2XcodeInstall.png) - -
- ---- - -You will then have the pop-up asking whether you want to install the command line tools (which contain Git). Select Install. - -![](images/MacOS/00_3CommandLineDeveloperTools.png) - -
- ---- - -You will then be asked to accept the license - -![](images/MacOS/00_4License.png) - -
- ---- - -Your installation will then proceed - -![](images/MacOS/00_5InstallProgress.png) - -
- ---- - -And if all goes well, the software will finish installing. - -![](images/MacOS/00_6Success.png) - - -
- ---- - -After you complete Positron installation (next section), if you check the version control tab on the action bar on the far left side of the screen, you should see the following if Git was installed correctly. - -![](images/MacOS/00_7Success.png) - -
- ---- - -Alternatively, if you see this, you will need to reattempt the installation. - -![](images/MacOS/00_8Unsuccess.png) - -
- ---- - -## Install Positron - -Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. - -![](images/MacOS/1_Positron.png) - -
- ---- - -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). - -With the license accepted, you will be able to select your operating system and the relevant installer depending on whether you are on an M1+ (ARM) or older Intel (x86) Mac. - -![](images/MacOS/2_PositronOS.png) - -
- - -Once the Download completes, proceed to install the package as you normally would for any other program. - -
- ---- - -# Connecting GitHub and Positron - -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your [GitHub](https://github.com/) account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: - -![](images/MacOS/14_Positron.png) - -
- ---- - -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. - - -![](images/MacOS/15_PositronSession.png) - -
- ---- - -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) - -![](images/MacOS/16_PositronActive.png) - -
- ---- - -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. - -![](images/MacOS/17_PositronGitHub.png) - -
- ---- - -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. - -![](images/MacOS/18.png) - -
- ---- - -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. - -![](images/Windows/41_GitHub.png) - -
- ---- - -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. - -![](images/MacOS/20.png) - -
- ---- - -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. - -![](images/MacOS/21_GitHubAccess.png) - -
- ---- - -And if all works out, you should see the following succes page - -![](images/MacOS/22.png) - -
- ---- - -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. - -![](images/MacOS/23_PositronAccessActive.png) - -
- ---- - -# New Folder from Git - -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option - -![](images/MacOS/24.png) - -
- ---- - -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" - -![](images/FolderFromGit1.png) - -
- ---- - -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. - -![](images/Import2.png) - -
- ---- - -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. - -![](images/MacOS/28.png) - -
- ---- - -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. - -![](images/Import2Done.png) - -
- ---- - -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" - -![](images/FolderFromGit2.png) - -
- ---- - -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. - -![](images/Import2.png) - -
- ---- - -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. - -![](images/Import2Done.png) - -
- ---- - - - -# Wrap-up - -In this walkthrough, we installed R, Positron, and ensured that Git/Command Line Tools were active. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. - -# Additional Resources - -[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on MacOS" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/ik395dIsFbc?si=Z90yMpRdzI1XzRPd) + + + +For screen-shot slides, click [here](/course/00_WorkstationSetup/MacOSSlides.qmd) + +This is the software installation walkthrough for those whose computers are running MacOS. Based on our pre-course interest form, you make up a solid proportion of the course participants. + +![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} + +# Background + +In this walkthrough, we will have you install the following pieces of software: + +[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. + +[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. + +[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. You may or may not already it on your computer depending on whether Xcode Command Line Tools is installed. + +Please note, the installation steps detailed below were carried out on a Mac with the older older pre-2020 x86 Intel chips, if you are running a Mac with the newer ARM (M1 or greater) chips, the installation instructions will differ some of the options you selecct during the download. If you encounter major differences in installation, please take screenshots and open an [issue](https://github.com/UMGCCCFCSR/CytometryInR/issues) so that we can update the documentation for your architecture. + +
+ +--- + +# Getting Started + +
+ +--- + +## Installing R + +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. + +![](images/MacOS/4_RLanding.png) + +
+ +--- + +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. + +![](images/MacOS/5_RMirror.png) + +
+ +--- + +You will then select your Operating System, in this case, [macOS](https://cloud.r-project.org/bin/macosx/) + + +![](images/MacOS/6_ROS.png) + +
+ +--- + +Next, you will need to select the appropiate [download](https://cloud.r-project.org/bin/macosx/) based on your computers architecture. On newer Macs (containing M1+ chips) this would the arm64 option on the center left of the screen. For the older Intel (pre-2020) Macs, you would select the x86_64 option. If you are unsure, check your [About This Mac](https://youtu.be/l3xW84TFeSA?si=i53tL5Ac_rEwEyjn) tab + +![](images/MacOS/7_RMacCPU.png) + +
+ +--- + +After the download has completed, launch the installer + +![](images/MacOS/8_RInstall.png) + +
+ +--- + +Proceed through the Read Me + +![](images/MacOS/9_RInstall.png) + +
+ +--- + +You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). + +![](images/MacOS/10_RInstallLicense.png) + +
+ +--- + +![](images/MacOS/11_RInstallLicense.png) + +
+ +--- + +Next, you will need to navigate through several pages, keeping the defaults. + +![](images/MacOS/12_RInstall.png) + +
+ +--- + +And with any luck, you should see that the installation was successful. + +![](images/MacOS/13_RInstall.png) + +
+ +--- + +## Xcode Command Line Tools + +Depending on your version of macOS, you may or may not already have [Git](https://git-scm.com/install/mac) installed on your computer. The reason is that it comes bundled within the Xcode Command Line Tools. + +If this is not your first foray into coding, you may have previously seen an installation pop-up along the lines of "XYZ requires command line developer tools. Would you like to install the tools now?" when installing an IDE (like Positron, Rstudio or Visual Studio Code). + +![](images/MacOS/00_Popup.png) + +
+ +--- + +Since these command line developer tools contain both Git, and also the equivalent of Rtools for Windows, we will need to install them for this course. To get started, first open your terminal. + +![](images/MacOS/00_1OpenTerminal.png) + +
+ +--- + +Next run the following code: + +```{r} +#| eval: FALSE +xcode-select --install +``` + +![](images/MacOS/00_2XcodeInstall.png) + +
+ +--- + +You will then have the pop-up asking whether you want to install the command line tools (which contain Git). Select Install. + +![](images/MacOS/00_3CommandLineDeveloperTools.png) + +
+ +--- + +You will then be asked to accept the license + +![](images/MacOS/00_4License.png) + +
+ +--- + +Your installation will then proceed + +![](images/MacOS/00_5InstallProgress.png) + +
+ +--- + +And if all goes well, the software will finish installing. + +![](images/MacOS/00_6Success.png) + + +
+ +--- + +After you complete Positron installation (next section), if you check the version control tab on the action bar on the far left side of the screen, you should see the following if Git was installed correctly. + +![](images/MacOS/00_7Success.png) + +
+ +--- + +Alternatively, if you see this, you will need to reattempt the installation. + +![](images/MacOS/00_8Unsuccess.png) + +
+ +--- + +## Install Positron + +Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. + +![](images/MacOS/1_Positron.png) + +
+ +--- + +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). + +With the license accepted, you will be able to select your operating system and the relevant installer depending on whether you are on an M1+ (ARM) or older Intel (x86) Mac. + +![](images/MacOS/2_PositronOS.png) + +
+ + +Once the Download completes, proceed to install the package as you normally would for any other program. + +
+ +--- + +# Connecting GitHub and Positron + +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your [GitHub](https://github.com/) account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: + +![](images/MacOS/14_Positron.png) + +
+ +--- + +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. + + +![](images/MacOS/15_PositronSession.png) + +
+ +--- + +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) + +![](images/MacOS/16_PositronActive.png) + +
+ +--- + +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. + +![](images/MacOS/17_PositronGitHub.png) + +
+ +--- + +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. + +![](images/MacOS/18.png) + +
+ +--- + +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. + +![](images/Windows/41_GitHub.png) + +
+ +--- + +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. + +![](images/MacOS/20.png) + +
+ +--- + +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. + +![](images/MacOS/21_GitHubAccess.png) + +
+ +--- + +And if all works out, you should see the following succes page + +![](images/MacOS/22.png) + +
+ +--- + +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. + +![](images/MacOS/23_PositronAccessActive.png) + +
+ +--- + +# New Folder from Git + +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option + +![](images/MacOS/24.png) + +
+ +--- + +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" + +![](images/FolderFromGit1.png) + +
+ +--- + +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. + +![](images/Import2.png) + +
+ +--- + +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. + +![](images/MacOS/28.png) + +
+ +--- + +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. + +![](images/Import2Done.png) + +
+ +--- + +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" + +![](images/FolderFromGit2.png) + +
+ +--- + +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. + +![](images/Import2.png) + +
+ +--- + +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. + +![](images/Import2Done.png) + +
+ +--- + + + +# Wrap-up + +In this walkthrough, we installed R, Positron, and ensured that Git/Command Line Tools were active. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. + +# Additional Resources + +[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/MacOSSlides.qmd b/course/00_WorkstationSetup/MacOSSlides.qmd index a154981..c181faa 100644 --- a/course/00_WorkstationSetup/MacOSSlides.qmd +++ b/course/00_WorkstationSetup/MacOSSlides.qmd @@ -1,619 +1,619 @@ ---- -title: "Installing Software on MacOS" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -::: {.fragment} -::: {.callout-tip title="."} -This is the software installation walkthrough for those whose computers are running MacOS. Based on our pre-course interest form, you make up a solid proportion of the course participants. -::: -::: - ---- - -![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} - ---- - -# Background - -::: {.fragment} -::: {.callout-tip title="."} -In this walkthrough, we will have you install the following pieces of software: - -[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. - -[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. - -[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. You may or may not already it on your computer depending on whether Xcode Command Line Tools is installed. - -Please note, the installation steps detailed below were carried out on a Mac with the older older pre-2020 x86 Intel chips, if you are running a Mac with the newer ARM (M1 or greater) chips, the installation instructions will differ some of the options you selecct during the download. If you encounter major differences in installation, please take screenshots and open an [issue](https://github.com/UMGCCCFCSR/CytometryInR/issues) so that we can update the documentation for your architecture. -::: -::: - - ---- - -# Getting Started - - ---- - -## Installing R - -::: {.fragment} -::: {.callout-tip title="."} -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. -::: -::: - ---- - -![](images/MacOS/4_RLanding.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. -::: -::: - ---- - -![](images/MacOS/5_RMirror.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then select your Operating System, in this case, [macOS](https://cloud.r-project.org/bin/macosx/) -::: -::: - ---- - -![](images/MacOS/6_ROS.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, you will need to select the appropiate [download](https://cloud.r-project.org/bin/macosx/) based on your computers architecture. On newer Macs (containing M1+ chips) this would the arm64 option on the center left of the screen. For the older Intel (pre-2020) Macs, you would select the x86_64 option. If you are unsure, check your [About This Mac](https://youtu.be/l3xW84TFeSA?si=i53tL5Ac_rEwEyjn) tab -::: -::: - ---- - -![](images/MacOS/7_RMacCPU.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After the download has completed, launch the installer -::: -::: - ---- - -![](images/MacOS/8_RInstall.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Proceed through the Read Me -::: -::: - ---- - -![](images/MacOS/9_RInstall.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). -::: -::: - ---- - -![](images/MacOS/10_RInstallLicense.png) - - ---- ---- - -![](images/MacOS/11_RInstallLicense.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, you will need to navigate through several pages, keeping the defaults. -::: -::: - ---- - -![](images/MacOS/12_RInstall.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And with any luck, you should see that the installation was successful. -::: -::: - ---- - -![](images/MacOS/13_RInstall.png) - - ---- - -## Xcode Command Line Tools - -::: {.fragment} -::: {.callout-tip title="."} -Depending on your version of macOS, you may or may not already have [Git](https://git-scm.com/install/mac) installed on your computer. The reason is that it comes bundled within the Xcode Command Line Tools. - -If this is not your first foray into coding, you may have previously seen an installation pop-up along the lines of "XYZ requires command line developer tools. Would you like to install the tools now?" when installing an IDE (like Positron, Rstudio or Visual Studio Code). -::: -::: - ---- - -![](images/MacOS/00_Popup.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Since these command line developer tools contain both Git, and also the equivalent of Rtools for Windows, we will need to install them for this course. To get started, first open your terminal. -::: -::: - ---- - -![](images/MacOS/00_1OpenTerminal.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next run the following code: -::: -::: - -```{r} -#| eval: FALSE -xcode-select --install -``` ---- - -![](images/MacOS/00_2XcodeInstall.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then have the pop-up asking whether you want to install the command line tools (which contain Git). Select Install. -::: -::: - ---- - -![](images/MacOS/00_3CommandLineDeveloperTools.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be asked to accept the license -::: -::: - ---- - -![](images/MacOS/00_4License.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Your installation will then proceed -::: -::: - ---- - -![](images/MacOS/00_5InstallProgress.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all goes well, the software will finish installing. -::: -::: - ---- - -![](images/MacOS/00_6Success.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After you complete Positron installation (next section), if you check the version control tab on the action bar on the far left side of the screen, you should see the following if Git was installed correctly. -::: -::: - ---- - -![](images/MacOS/00_7Success.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, if you see this, you will need to reattempt the installation. -::: -::: - ---- - -![](images/MacOS/00_8Unsuccess.png) - - ---- - -## Install Positron - -::: {.fragment} -::: {.callout-tip title="."} -Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. -::: -::: - ---- - -![](images/MacOS/1_Positron.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). - -With the license accepted, you will be able to select your operating system and the relevant installer depending on whether you are on an M1+ (ARM) or older Intel (x86) Mac. -::: -::: - ---- - -![](images/MacOS/2_PositronOS.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once the Download completes, proceed to install the package as you normally would for any other program. -::: -::: - - ---- - -# Connecting GitHub and Positron - -::: {.fragment} -::: {.callout-tip title="."} -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your [GitHub](https://github.com/) account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: -::: -::: - ---- - -![](images/MacOS/14_Positron.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. -::: -::: - ---- - -![](images/MacOS/15_PositronSession.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) -::: -::: - ---- - -![](images/MacOS/16_PositronActive.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. -::: -::: - ---- - -![](images/MacOS/17_PositronGitHub.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. -::: -::: - ---- - -![](images/MacOS/18.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. -::: -::: - ---- - -![](images/Windows/41_GitHub.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. -::: -::: - ---- - -![](images/MacOS/20.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. -::: -::: - ---- - -![](images/MacOS/21_GitHubAccess.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all works out, you should see the following succes page -::: -::: - ---- - -![](images/MacOS/22.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. -::: -::: - ---- - -![](images/MacOS/23_PositronAccessActive.png) - - ---- - -# New Folder from Git - -::: {.fragment} -::: {.callout-tip title="."} -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option -::: -::: - ---- - -![](images/MacOS/24.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" -::: -::: - ---- - -![](images/FolderFromGit1.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. -::: -::: - ---- - -![](images/Import2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. -::: -::: - ---- - -![](images/MacOS/28.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. -::: -::: - ---- - -![](images/Import2Done.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" -::: -::: - ---- - -![](images/FolderFromGit2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. -::: -::: - ---- - -![](images/Import2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. -::: -::: - ---- - -![](images/Import2Done.png) - - ---- - - - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -In this walkthrough, we installed R, Positron, and ensured that Git/Command Line Tools were active. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. -::: -::: - -# Additional Resources - -[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on MacOS" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +::: {.fragment} +::: {.callout-tip title="."} +This is the software installation walkthrough for those whose computers are running MacOS. Based on our pre-course interest form, you make up a solid proportion of the course participants. +::: +::: + +--- + +![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} + +--- + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +In this walkthrough, we will have you install the following pieces of software: + +[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. + +[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. + +[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. You may or may not already it on your computer depending on whether Xcode Command Line Tools is installed. + +Please note, the installation steps detailed below were carried out on a Mac with the older older pre-2020 x86 Intel chips, if you are running a Mac with the newer ARM (M1 or greater) chips, the installation instructions will differ some of the options you selecct during the download. If you encounter major differences in installation, please take screenshots and open an [issue](https://github.com/UMGCCCFCSR/CytometryInR/issues) so that we can update the documentation for your architecture. +::: +::: + + +--- + +# Getting Started + + +--- + +## Installing R + +::: {.fragment} +::: {.callout-tip title="."} +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. +::: +::: + +--- + +![](images/MacOS/4_RLanding.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. +::: +::: + +--- + +![](images/MacOS/5_RMirror.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then select your Operating System, in this case, [macOS](https://cloud.r-project.org/bin/macosx/) +::: +::: + +--- + +![](images/MacOS/6_ROS.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, you will need to select the appropiate [download](https://cloud.r-project.org/bin/macosx/) based on your computers architecture. On newer Macs (containing M1+ chips) this would the arm64 option on the center left of the screen. For the older Intel (pre-2020) Macs, you would select the x86_64 option. If you are unsure, check your [About This Mac](https://youtu.be/l3xW84TFeSA?si=i53tL5Ac_rEwEyjn) tab +::: +::: + +--- + +![](images/MacOS/7_RMacCPU.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After the download has completed, launch the installer +::: +::: + +--- + +![](images/MacOS/8_RInstall.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Proceed through the Read Me +::: +::: + +--- + +![](images/MacOS/9_RInstall.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). +::: +::: + +--- + +![](images/MacOS/10_RInstallLicense.png) + + +--- +--- + +![](images/MacOS/11_RInstallLicense.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, you will need to navigate through several pages, keeping the defaults. +::: +::: + +--- + +![](images/MacOS/12_RInstall.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And with any luck, you should see that the installation was successful. +::: +::: + +--- + +![](images/MacOS/13_RInstall.png) + + +--- + +## Xcode Command Line Tools + +::: {.fragment} +::: {.callout-tip title="."} +Depending on your version of macOS, you may or may not already have [Git](https://git-scm.com/install/mac) installed on your computer. The reason is that it comes bundled within the Xcode Command Line Tools. + +If this is not your first foray into coding, you may have previously seen an installation pop-up along the lines of "XYZ requires command line developer tools. Would you like to install the tools now?" when installing an IDE (like Positron, Rstudio or Visual Studio Code). +::: +::: + +--- + +![](images/MacOS/00_Popup.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Since these command line developer tools contain both Git, and also the equivalent of Rtools for Windows, we will need to install them for this course. To get started, first open your terminal. +::: +::: + +--- + +![](images/MacOS/00_1OpenTerminal.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next run the following code: +::: +::: + +```{r} +#| eval: FALSE +xcode-select --install +``` +--- + +![](images/MacOS/00_2XcodeInstall.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then have the pop-up asking whether you want to install the command line tools (which contain Git). Select Install. +::: +::: + +--- + +![](images/MacOS/00_3CommandLineDeveloperTools.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be asked to accept the license +::: +::: + +--- + +![](images/MacOS/00_4License.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Your installation will then proceed +::: +::: + +--- + +![](images/MacOS/00_5InstallProgress.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all goes well, the software will finish installing. +::: +::: + +--- + +![](images/MacOS/00_6Success.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After you complete Positron installation (next section), if you check the version control tab on the action bar on the far left side of the screen, you should see the following if Git was installed correctly. +::: +::: + +--- + +![](images/MacOS/00_7Success.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, if you see this, you will need to reattempt the installation. +::: +::: + +--- + +![](images/MacOS/00_8Unsuccess.png) + + +--- + +## Install Positron + +::: {.fragment} +::: {.callout-tip title="."} +Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. +::: +::: + +--- + +![](images/MacOS/1_Positron.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). + +With the license accepted, you will be able to select your operating system and the relevant installer depending on whether you are on an M1+ (ARM) or older Intel (x86) Mac. +::: +::: + +--- + +![](images/MacOS/2_PositronOS.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once the Download completes, proceed to install the package as you normally would for any other program. +::: +::: + + +--- + +# Connecting GitHub and Positron + +::: {.fragment} +::: {.callout-tip title="."} +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your [GitHub](https://github.com/) account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: +::: +::: + +--- + +![](images/MacOS/14_Positron.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. +::: +::: + +--- + +![](images/MacOS/15_PositronSession.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) +::: +::: + +--- + +![](images/MacOS/16_PositronActive.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. +::: +::: + +--- + +![](images/MacOS/17_PositronGitHub.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. +::: +::: + +--- + +![](images/MacOS/18.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. +::: +::: + +--- + +![](images/Windows/41_GitHub.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. +::: +::: + +--- + +![](images/MacOS/20.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. +::: +::: + +--- + +![](images/MacOS/21_GitHubAccess.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all works out, you should see the following succes page +::: +::: + +--- + +![](images/MacOS/22.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. +::: +::: + +--- + +![](images/MacOS/23_PositronAccessActive.png) + + +--- + +# New Folder from Git + +::: {.fragment} +::: {.callout-tip title="."} +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option +::: +::: + +--- + +![](images/MacOS/24.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" +::: +::: + +--- + +![](images/FolderFromGit1.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. +::: +::: + +--- + +![](images/Import2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. +::: +::: + +--- + +![](images/MacOS/28.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. +::: +::: + +--- + +![](images/Import2Done.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" +::: +::: + +--- + +![](images/FolderFromGit2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. +::: +::: + +--- + +![](images/Import2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. +::: +::: + +--- + +![](images/Import2Done.png) + + +--- + + + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +In this walkthrough, we installed R, Positron, and ensured that Git/Command Line Tools were active. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. +::: +::: + +# Additional Resources + +[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/Windows.qmd b/course/00_WorkstationSetup/Windows.qmd index 1133d72..2ce2f43 100644 --- a/course/00_WorkstationSetup/Windows.qmd +++ b/course/00_WorkstationSetup/Windows.qmd @@ -1,663 +1,663 @@ ---- -title: "Installing Software on Windows" -author: "David Rach" -date: 01-21-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://www.youtube.com/live/WP6JMzlj6B4?si=P1EE1NzLO8i5L0cE) - - - -For screen-shots slides, click [here](/course/00_WorkstationSetup/WindowsSlides.qmd) - - - -This is the software installation walkthrough for those whose computers are running Windows. Based on our pre-course interest form, you make up the majority of course participants. - -![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} - -# Background - -
- ---- - -In this walkthrough, we will have you install the following pieces of software: - -[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. - -[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. - -[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. - -Additionally, Windows users will need to install: - -[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. - -# Getting Started - -
- ---- - -## Installing R - -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. - -![](images/Windows/01_RLanding.png) - -
- ---- - -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. - -![](images/Windows/02_Landing.png) - -
- ---- - -You will then select your Operating System, in this case, [Windows](https://cloud.r-project.org/bin/windows/). - -![](images/Windows/03_ForWindows.png) - -
- ---- - -And go ahead and select the [Install R for the first time](https://cloud.r-project.org/bin/windows/base/) link. - -![](images/Windows/04_ForFirstTime.png) - -
- ---- - - -Next, you will select the download the current version option at the top of the page. - - -![](images/Windows/04_CurrentVersion.png) - -
- ---- - -The popup window will then ask where you want to save the installer (.exe) file. We generally save this to either Downloads or Desktop to make finding it easier. - -![](images/Windows/05_SaveTheInstaller.png) - - -
- ---- - -After the download is complete, double click on the installer's .exe file. This will open a popup asking you to select your preferred language. - -![](images/Windows/07_DesiredLanguage.png) - -
- ---- - -You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). - -![](images/Windows/08_GPL2.png) - -
- ---- - -On Windows, R will normally save it's software folder under Program Files. - -![](images/Windows/09_ProgramFiles.png) - -
- ---- - -Next, please accept the defaults. - -![](images/Windows/10_Defaults.png) - -
- ---- - - -![](images/Windows/11_Defaults.png) - -
- ---- - -![](images/Windows/12_Defaults.png) - -
- ---- - -![](images/Windows/13_Defaults.png) - -
- ---- - -With the defaults accepted, the installation will commence. Feel free to go have a coffee/tea/beverage-of-your choice break while you wait. - -![](images/Windows/14_Install.png) - -
- ---- - -And if all goes well, the installation will complete without any issues. - -![](images/Windows/15_Success.png) - -
- ---- - -## Installing RTools - -We will now work on installing Rtools. This software is needed when building R packages from source, which we will need throughout the course for R packages hosted on GitHub. - -To get started, we will return to the [R installation](https://cloud.r-project.org/) page we visited previously and instead click on the [Rtools](https://cloud.r-project.org/bin/windows/Rtools/) option. - - -![](images/Windows/16_Rtools.png) - -
- ---- - -Next, select the most recent version of Rtools to Download. - -![](images/Windows/17_RtoolsRecent.png) - -
- ---- - -You will then select for your architecture. For the vast majority of Windows users, your computer will likely be be using a x86 chip architecture, so you would select the Rtools45 installer option. - -If your computer however uses the ARM chip architecture, you would select the 64-bit ARM Rtools45 installer instead. If you are unsure, see the [following](https://youtu.be/Z_lcEqomG0k?si=U0fd7sHTZhCJroSm). - -![](images/Windows/18_64x86.png) - -
- ---- - -Next, you will select the location to save the Rtools installer to. We generally save this to either Downloads or Desktop to make finding it easier. - - - -![](images/Windows/17_Downloads.png) - -
- ---- - -Once downloaded, double click on the .exe to launch the Rtools installer. - - -![](images/Windows/19_RtoolsInstall.png) - -
- ---- - -Similar to what we did when installing R, go ahead and keep the defaults. - -![](images/Windows/20_RtoolsDefaults.png) - -
- ---- - -And click install to proceed with the installation. - -![](images/Windows/21_RtoolsDefaults.png) - -
- ---- - -And wait while the installation wraps up. - -![](images/Windows/22_Download.png) - -
- ---- - -If all goes well, you should see the following installation success page. - -![](images/Windows/24_Rtools.png) - -
- ---- - -## Installing Git - -[Git](https://git-scm.com/) is a version control software widely used among software developers and bioinformaticians. We will use it extensively throughout the course, both locally on our computers (to keep track of changes to our files), as well as in combination with [GitHub](https://github.com/)(to maintain online backups of our files). - -We will first navigate to the [website](https://git-scm.com/) and select the download from Windows option. - - -
- ---- - -![](images/Windows/01_Git.png){fig-align="center" width="600"} - -
- ---- - -We will then proceed and select [install 64-bit Git for Windows Setup]{.underline} option - -![](images/Windows/02_Git.png){fig-align="center" width="600"} - -
- ---- - -As was the case with our installation of R and Rtools, a pop-up will appear asking for a location to save the installer to. - -Once downloaded, double-click and proceed with the installation. - -You will be asked to accept the Git License (which is the free copyleft GPL2 license, which we will learn about later in the course). - -![](images/Windows/02_GitLicense.png) - -
- ---- - -Then you will be asked to select the folder to save to software to (usually your Programs folder) - -![](images/Windows/03_GitDestination.png) - -
- ---- - -At this point, the Git installer will ask a series of increasingly niche questions. It is best to just accept all the default options, to avoid wandering too far down a ["What is Vim?!?"](https://www.vim.org/) rabbit-hole. - -![](images/Windows/04_GitComponents.png) - -
- ---- - -![](images/Windows/05_GitStartMenu.png) - -
- ---- - -![](images/Windows/06_GitWhatsVim.png) - -
- ---- - -![](images/Windows/07_GitDecide.png) - -
- ---- - -![](images/Windows/08_GitCommandLine.png) - -
- ---- - -![](images/Windows/09_GitBundledSSH.png) - -
- ---- - -![](images/Windows/10_GitHTTPS.png) - -
- ---- - -![](images/Windows/11_GitUnix.png) - -
- ---- - -![](images/Windows/12_GitEmulator.png) - -
- ---- - -![](images/Windows/13_GitPull.png) - -
- ---- - -![](images/Windows/14_GitCredentialManager.png) - -
- ---- - -Having made it through all the niche customization screens, we finally reach the install button. - -![](images/Windows/15_GitFileCatch.png) - -
- ---- - -We then can wait for the install to complete. - -![](images/Windows/16_GitInstalling.png) - -
- ---- - -And success, we have now installed Git. - -![](images/Windows/17_GitInstalled.png) - -
- ---- - - -## Installing Positron - -Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. - -![](images/Windows/25_Positron.png) - -
- ---- - -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). - -With the license accepted, you will be able to select your operating system. In this case, we will select Windows, specifally the user level install. - -![](images/Windows/26_UserInstall.png) - -
- ---- - -Please note, if you are using a Windows computer with an ARM based chip (like is the case with Snapdragons), you will need to download the installed from the Positron's GitHub [Release Page](), as they are still testing some features. - -![](images/Windows/WindowsArm.png) - ---- - -You will then be prompted to select the location you want to save the installer to. We will generally save this to either Downloads or Desktop to make finding it easier. - -![](images/Windows/27_InstallerLocation.png) - -
- ---- - -Once the download is complete, double click on the installer, and again accept the license agreement. - -![](images/Windows/28_Elastic.png) - -
- ---- - -Generally, Positron will be store its software folder under Program Files. - -![](images/Windows/29_SaveLocation.png) - -
- ---- - -Next up, accept the default options for the following screens - -![](images/Windows/30_Defaults.png) - -
- ---- - -![](images/Windows/31_Defaults.png) - -
- ---- - -And finally, click Install. - -![](images/Windows/32_Defaults.png) - -
- ---- - -![](images/Windows/34_Install.png) -
- ---- - -If all goes well, you should then see the installation success page. - -![](images/Windows/35_Success.png) - -
- ---- - -# Connecting GitHub and Positron - -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: - -![](images/Windows/36_PositronLanding.png) - -
- ---- - -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. - -![](images/Windows/37_AllHiddenCondas.png) - -
- ---- - -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) - -![](images/Windows/38_Loaded.png) - -
- ---- - -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. - -![](images/Windows/39_GitHubSetup.png) - -
- ---- - -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. - -![](images/Windows/40_Code.png) - -
- ---- - -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. - -![](images/Windows/41_GitHub.png) - -
- ---- - -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. - -![](images/Windows/42_GitHubPassword.png) - -
- ---- - -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. - -![](images/Windows/43_GitHubSetup.png) - -
- ---- - -Depending on your computer settings, you may be asked for your two-factor authorization passkey. If so, complete this step. - -![](images/Windows/44_Passkey.png) - -
- ---- - -And if all works out, you should see the following succes page - -![](images/Windows/45_PasskeySuccess.png) - -
- ---- - -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. - -![](images/Windows/46_PositronSuccess.png) - -
- ---- - -# New Folder from Git - -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option - -![](images/MacOS/24.png) - -
- ---- - -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" - -![](images/FolderFromGit1.png) - -
- ---- - -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. - -![](images/Import2.png) - -
- ---- - -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. - -![](images/MacOS/28.png) - -
- ---- - -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. - -![](images/Import2Done.png) - -
- ---- - -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" - -![](images/FolderFromGit2.png) - -
- ---- - -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. - -![](images/Import2.png) - -
- ---- - -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. - -![](images/Import2Done.png) - -
- ---- - -# Wrap-up - -In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. - -
- ---- - -# Additional Resources - -[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on Windows" +author: "David Rach" +date: 01-21-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/WP6JMzlj6B4?si=P1EE1NzLO8i5L0cE) + + + +For screen-shots slides, click [here](/course/00_WorkstationSetup/WindowsSlides.qmd) + + + +This is the software installation walkthrough for those whose computers are running Windows. Based on our pre-course interest form, you make up the majority of course participants. + +![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} + +# Background + +
+ +--- + +In this walkthrough, we will have you install the following pieces of software: + +[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. + +[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. + +[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. + +Additionally, Windows users will need to install: + +[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. + +# Getting Started + +
+ +--- + +## Installing R + +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. + +![](images/Windows/01_RLanding.png) + +
+ +--- + +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. + +![](images/Windows/02_Landing.png) + +
+ +--- + +You will then select your Operating System, in this case, [Windows](https://cloud.r-project.org/bin/windows/). + +![](images/Windows/03_ForWindows.png) + +
+ +--- + +And go ahead and select the [Install R for the first time](https://cloud.r-project.org/bin/windows/base/) link. + +![](images/Windows/04_ForFirstTime.png) + +
+ +--- + + +Next, you will select the download the current version option at the top of the page. + + +![](images/Windows/04_CurrentVersion.png) + +
+ +--- + +The popup window will then ask where you want to save the installer (.exe) file. We generally save this to either Downloads or Desktop to make finding it easier. + +![](images/Windows/05_SaveTheInstaller.png) + + +
+ +--- + +After the download is complete, double click on the installer's .exe file. This will open a popup asking you to select your preferred language. + +![](images/Windows/07_DesiredLanguage.png) + +
+ +--- + +You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). + +![](images/Windows/08_GPL2.png) + +
+ +--- + +On Windows, R will normally save it's software folder under Program Files. + +![](images/Windows/09_ProgramFiles.png) + +
+ +--- + +Next, please accept the defaults. + +![](images/Windows/10_Defaults.png) + +
+ +--- + + +![](images/Windows/11_Defaults.png) + +
+ +--- + +![](images/Windows/12_Defaults.png) + +
+ +--- + +![](images/Windows/13_Defaults.png) + +
+ +--- + +With the defaults accepted, the installation will commence. Feel free to go have a coffee/tea/beverage-of-your choice break while you wait. + +![](images/Windows/14_Install.png) + +
+ +--- + +And if all goes well, the installation will complete without any issues. + +![](images/Windows/15_Success.png) + +
+ +--- + +## Installing RTools + +We will now work on installing Rtools. This software is needed when building R packages from source, which we will need throughout the course for R packages hosted on GitHub. + +To get started, we will return to the [R installation](https://cloud.r-project.org/) page we visited previously and instead click on the [Rtools](https://cloud.r-project.org/bin/windows/Rtools/) option. + + +![](images/Windows/16_Rtools.png) + +
+ +--- + +Next, select the most recent version of Rtools to Download. + +![](images/Windows/17_RtoolsRecent.png) + +
+ +--- + +You will then select for your architecture. For the vast majority of Windows users, your computer will likely be be using a x86 chip architecture, so you would select the Rtools45 installer option. + +If your computer however uses the ARM chip architecture, you would select the 64-bit ARM Rtools45 installer instead. If you are unsure, see the [following](https://youtu.be/Z_lcEqomG0k?si=U0fd7sHTZhCJroSm). + +![](images/Windows/18_64x86.png) + +
+ +--- + +Next, you will select the location to save the Rtools installer to. We generally save this to either Downloads or Desktop to make finding it easier. + + + +![](images/Windows/17_Downloads.png) + +
+ +--- + +Once downloaded, double click on the .exe to launch the Rtools installer. + + +![](images/Windows/19_RtoolsInstall.png) + +
+ +--- + +Similar to what we did when installing R, go ahead and keep the defaults. + +![](images/Windows/20_RtoolsDefaults.png) + +
+ +--- + +And click install to proceed with the installation. + +![](images/Windows/21_RtoolsDefaults.png) + +
+ +--- + +And wait while the installation wraps up. + +![](images/Windows/22_Download.png) + +
+ +--- + +If all goes well, you should see the following installation success page. + +![](images/Windows/24_Rtools.png) + +
+ +--- + +## Installing Git + +[Git](https://git-scm.com/) is a version control software widely used among software developers and bioinformaticians. We will use it extensively throughout the course, both locally on our computers (to keep track of changes to our files), as well as in combination with [GitHub](https://github.com/)(to maintain online backups of our files). + +We will first navigate to the [website](https://git-scm.com/) and select the download from Windows option. + + +
+ +--- + +![](images/Windows/01_Git.png){fig-align="center" width="600"} + +
+ +--- + +We will then proceed and select [install 64-bit Git for Windows Setup]{.underline} option + +![](images/Windows/02_Git.png){fig-align="center" width="600"} + +
+ +--- + +As was the case with our installation of R and Rtools, a pop-up will appear asking for a location to save the installer to. + +Once downloaded, double-click and proceed with the installation. + +You will be asked to accept the Git License (which is the free copyleft GPL2 license, which we will learn about later in the course). + +![](images/Windows/02_GitLicense.png) + +
+ +--- + +Then you will be asked to select the folder to save to software to (usually your Programs folder) + +![](images/Windows/03_GitDestination.png) + +
+ +--- + +At this point, the Git installer will ask a series of increasingly niche questions. It is best to just accept all the default options, to avoid wandering too far down a ["What is Vim?!?"](https://www.vim.org/) rabbit-hole. + +![](images/Windows/04_GitComponents.png) + +
+ +--- + +![](images/Windows/05_GitStartMenu.png) + +
+ +--- + +![](images/Windows/06_GitWhatsVim.png) + +
+ +--- + +![](images/Windows/07_GitDecide.png) + +
+ +--- + +![](images/Windows/08_GitCommandLine.png) + +
+ +--- + +![](images/Windows/09_GitBundledSSH.png) + +
+ +--- + +![](images/Windows/10_GitHTTPS.png) + +
+ +--- + +![](images/Windows/11_GitUnix.png) + +
+ +--- + +![](images/Windows/12_GitEmulator.png) + +
+ +--- + +![](images/Windows/13_GitPull.png) + +
+ +--- + +![](images/Windows/14_GitCredentialManager.png) + +
+ +--- + +Having made it through all the niche customization screens, we finally reach the install button. + +![](images/Windows/15_GitFileCatch.png) + +
+ +--- + +We then can wait for the install to complete. + +![](images/Windows/16_GitInstalling.png) + +
+ +--- + +And success, we have now installed Git. + +![](images/Windows/17_GitInstalled.png) + +
+ +--- + + +## Installing Positron + +Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. + +![](images/Windows/25_Positron.png) + +
+ +--- + +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). + +With the license accepted, you will be able to select your operating system. In this case, we will select Windows, specifally the user level install. + +![](images/Windows/26_UserInstall.png) + +
+ +--- + +Please note, if you are using a Windows computer with an ARM based chip (like is the case with Snapdragons), you will need to download the installed from the Positron's GitHub [Release Page](), as they are still testing some features. + +![](images/Windows/WindowsArm.png) + +--- + +You will then be prompted to select the location you want to save the installer to. We will generally save this to either Downloads or Desktop to make finding it easier. + +![](images/Windows/27_InstallerLocation.png) + +
+ +--- + +Once the download is complete, double click on the installer, and again accept the license agreement. + +![](images/Windows/28_Elastic.png) + +
+ +--- + +Generally, Positron will be store its software folder under Program Files. + +![](images/Windows/29_SaveLocation.png) + +
+ +--- + +Next up, accept the default options for the following screens + +![](images/Windows/30_Defaults.png) + +
+ +--- + +![](images/Windows/31_Defaults.png) + +
+ +--- + +And finally, click Install. + +![](images/Windows/32_Defaults.png) + +
+ +--- + +![](images/Windows/34_Install.png) +
+ +--- + +If all goes well, you should then see the installation success page. + +![](images/Windows/35_Success.png) + +
+ +--- + +# Connecting GitHub and Positron + +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: + +![](images/Windows/36_PositronLanding.png) + +
+ +--- + +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. + +![](images/Windows/37_AllHiddenCondas.png) + +
+ +--- + +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) + +![](images/Windows/38_Loaded.png) + +
+ +--- + +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. + +![](images/Windows/39_GitHubSetup.png) + +
+ +--- + +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. + +![](images/Windows/40_Code.png) + +
+ +--- + +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. + +![](images/Windows/41_GitHub.png) + +
+ +--- + +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. + +![](images/Windows/42_GitHubPassword.png) + +
+ +--- + +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. + +![](images/Windows/43_GitHubSetup.png) + +
+ +--- + +Depending on your computer settings, you may be asked for your two-factor authorization passkey. If so, complete this step. + +![](images/Windows/44_Passkey.png) + +
+ +--- + +And if all works out, you should see the following succes page + +![](images/Windows/45_PasskeySuccess.png) + +
+ +--- + +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. + +![](images/Windows/46_PositronSuccess.png) + +
+ +--- + +# New Folder from Git + +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option + +![](images/MacOS/24.png) + +
+ +--- + +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" + +![](images/FolderFromGit1.png) + +
+ +--- + +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. + +![](images/Import2.png) + +
+ +--- + +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. + +![](images/MacOS/28.png) + +
+ +--- + +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. + +![](images/Import2Done.png) + +
+ +--- + +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" + +![](images/FolderFromGit2.png) + +
+ +--- + +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. + +![](images/Import2.png) + +
+ +--- + +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. + +![](images/Import2Done.png) + +
+ +--- + +# Wrap-up + +In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. + +
+ +--- + +# Additional Resources + +[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/WindowsSlides.qmd b/course/00_WorkstationSetup/WindowsSlides.qmd index ec70008..c1bca79 100644 --- a/course/00_WorkstationSetup/WindowsSlides.qmd +++ b/course/00_WorkstationSetup/WindowsSlides.qmd @@ -1,920 +1,920 @@ ---- -title: "Installing Software on Windows" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -::: {.fragment} -::: {.callout-tip title="."} -This is the software installation walkthrough for those whose computers are running Windows. Based on our pre-course interest form, you make up the majority of course participants. -::: -::: - ---- - -![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} - ---- - -# Background - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this walkthrough, we will have you install the following pieces of software: - -[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. - -[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. - -[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. - -Additionally, Windows users will need to install: - -[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. -::: -::: - -# Getting Started - - ---- - -## Installing R - -::: {.fragment} -::: {.callout-tip title="."} -To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. -::: -::: - ---- - -![](images/Windows/01_RLanding.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. -::: -::: - ---- - -![](images/Windows/02_Landing.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then select your Operating System, in this case, [Windows](https://cloud.r-project.org/bin/windows/). -::: -::: - ---- - -![](images/Windows/03_ForWindows.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And go ahead and select the [Install R for the first time](https://cloud.r-project.org/bin/windows/base/) link. -::: -::: - ---- - -![](images/Windows/04_ForFirstTime.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, you will select the download the current version option at the top of the page. -::: -::: - ---- - -![](images/Windows/04_CurrentVersion.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The popup window will then ask where you want to save the installer (.exe) file. We generally save this to either Downloads or Desktop to make finding it easier. -::: -::: - ---- - -![](images/Windows/05_SaveTheInstaller.png) - - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After the download is complete, double click on the installer's .exe file. This will open a popup asking you to select your preferred language. -::: -::: - ---- - -![](images/Windows/07_DesiredLanguage.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). -::: -::: - ---- - -![](images/Windows/08_GPL2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On Windows, R will normally save it's software folder under Program Files. -::: -::: - ---- - -![](images/Windows/09_ProgramFiles.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, please accept the defaults. -::: -::: - ---- - -![](images/Windows/10_Defaults.png) - - ---- - - -![](images/Windows/11_Defaults.png) - ---- - -![](images/Windows/12_Defaults.png) - ---- - -![](images/Windows/13_Defaults.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With the defaults accepted, the installation will commence. Feel free to go have a coffee/tea/beverage-of-your choice break while you wait. -::: -::: - ---- - -![](images/Windows/14_Install.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all goes well, the installation will complete without any issues. -::: -::: - ---- - -![](images/Windows/15_Success.png) - - ---- - -## Installing RTools - -::: {.fragment} -::: {.callout-tip title="."} -We will now work on installing Rtools. This software is needed when building R packages from source, which we will need throughout the course for R packages hosted on GitHub. - -To get started, we will return to the [R installation](https://cloud.r-project.org/) page we visited previously and instead click on the [Rtools](https://cloud.r-project.org/bin/windows/Rtools/) option. -::: -::: - ---- - -![](images/Windows/16_Rtools.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, select the most recent version of Rtools to Download. -::: -::: - ---- - -![](images/Windows/17_RtoolsRecent.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then select for your architecture. For the vast majority of Windows users, your computer will likely be be using a x86 chip architecture, so you would select the Rtools45 installer option. - -If your computer however uses the ARM chip architecture, you would select the 64-bit ARM Rtools45 installer instead. If you are unsure, see the [following](https://youtu.be/Z_lcEqomG0k?si=U0fd7sHTZhCJroSm). -::: -::: - ---- - -![](images/Windows/18_64x86.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, you will select the location to save the Rtools installer to. We generally save this to either Downloads or Desktop to make finding it easier. -::: -::: - ---- - -![](images/Windows/17_Downloads.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once downloaded, double click on the .exe to launch the Rtools installer. -::: -::: - ---- - -![](images/Windows/19_RtoolsInstall.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similar to what we did when installing R, go ahead and keep the defaults. -::: -::: - ---- - -![](images/Windows/20_RtoolsDefaults.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And click install to proceed with the installation. -::: -::: - ---- - -![](images/Windows/21_RtoolsDefaults.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And wait while the installation wraps up. -::: -::: - ---- - -![](images/Windows/22_Download.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If all goes well, you should see the following installation success page. -::: -::: - ---- - -![](images/Windows/24_Rtools.png) - - ---- - -## Installing Git - -::: {.fragment} -::: {.callout-tip title="."} -[Git](https://git-scm.com/) is a version control software widely used among software developers and bioinformaticians. We will use it extensively throughout the course, both locally on our computers (to keep track of changes to our files), as well as in combination with [GitHub](https://github.com/)(to maintain online backups of our files). - -We will first navigate to the [website](https://git-scm.com/) and select the download from Windows option. -::: -::: - ---- - -![](images/Windows/01_Git.png){fig-align="center" width="600"} - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will then proceed and select [install 64-bit Git for Windows Setup]{.underline} option -::: -::: - ---- - -![](images/Windows/02_Git.png){fig-align="center" width="600"} - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As was the case with our installation of R and Rtools, a pop-up will appear asking for a location to save the installer to. - -Once downloaded, double-click and proceed with the installation. - -You will be asked to accept the Git License (which is the free copyleft GPL2 license, which we will learn about later in the course). -::: -::: - ---- - -![](images/Windows/02_GitLicense.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Then you will be asked to select the folder to save to software to (usually your Programs folder) -::: -::: - ---- - -![](images/Windows/03_GitDestination.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -At this point, the Git installer will ask a series of increasingly niche questions. It is best to just accept all the default options, to avoid wandering too far down a ["What is Vim?!?"](https://www.vim.org/) rabbit-hole. -::: -::: - ---- - -![](images/Windows/04_GitComponents.png) - - ---- - -![](images/Windows/05_GitStartMenu.png) - ---- - -![](images/Windows/06_GitWhatsVim.png) - - ---- - -![](images/Windows/07_GitDecide.png) - ---- - -![](images/Windows/08_GitCommandLine.png) - - ---- - -![](images/Windows/09_GitBundledSSH.png) - ---- - -![](images/Windows/10_GitHTTPS.png) - ---- - -![](images/Windows/11_GitUnix.png) - ---- - -![](images/Windows/12_GitEmulator.png) - ---- - -![](images/Windows/13_GitPull.png) - ---- - -![](images/Windows/14_GitCredentialManager.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having made it through all the niche customization screens, we finally reach the install button. -::: -::: - ---- - -![](images/Windows/15_GitFileCatch.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We then can wait for the install to complete. -::: -::: - ---- - -![](images/Windows/16_GitInstalling.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And success, we have now installed Git. -::: -::: - ---- - -![](images/Windows/17_GitInstalled.png) - - ---- - - -## Installing Positron - -::: {.fragment} -::: {.callout-tip title="."} -Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. - -First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. -::: -::: - ---- - -![](images/Windows/25_Positron.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). - -With the license accepted, you will be able to select your operating system. In this case, we will select Windows, specifally the user level install. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -![](images/Windows/26_UserInstall.png) -::: -::: - ---- - -Please note, if you are using a Windows computer with an ARM based chip (like is the case with Snapdragons), you will need to download the installed from the Positron's GitHub [Release Page](), as they are still testing some features. - ---- - -![](images/Windows/WindowsArm.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to select the location you want to save the installer to. We will generally save this to either Downloads or Desktop to make finding it easier. -::: -::: - ---- - -![](images/Windows/27_InstallerLocation.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once the download is complete, double click on the installer, and again accept the license agreement. -::: -::: - ---- - -![](images/Windows/28_Elastic.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Generally, Positron will be store its software folder under Program Files. -::: -::: - ---- - -![](images/Windows/29_SaveLocation.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next up, accept the default options for the following screens -::: -::: - ---- - -![](images/Windows/30_Defaults.png) - ---- - -![](images/Windows/31_Defaults.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And finally, click Install. -::: -::: - ---- - -![](images/Windows/32_Defaults.png) - ---- - -![](images/Windows/34_Install.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If all goes well, you should then see the installation success page. -::: -::: - ---- - -![](images/Windows/35_Success.png) - - ---- - -# Connecting GitHub and Positron - -::: {.fragment} -::: {.callout-tip title="."} -Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. - -When opening Positron for the first time, you will encounter the following view: -::: -::: - ---- - -![](images/Windows/36_PositronLanding.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. -::: -::: - ---- - -![](images/Windows/37_AllHiddenCondas.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) -::: -::: - ---- - -![](images/Windows/38_Loaded.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. - -Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. -::: -::: - ---- - -![](images/Windows/39_GitHubSetup.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. -::: -::: - ---- - -![](images/Windows/40_Code.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. -::: -::: - ---- - -![](images/Windows/41_GitHub.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. -::: -::: - ---- - -![](images/Windows/42_GitHubPassword.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. -::: -::: - ---- - -![](images/Windows/43_GitHubSetup.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Depending on your computer settings, you may be asked for your two-factor authorization passkey. If so, complete this step. -::: -::: - ---- - -![](images/Windows/44_Passkey.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And if all works out, you should see the following succes page -::: -::: - ---- - -![](images/Windows/45_PasskeySuccess.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. -::: -::: - ---- - -![](images/Windows/46_PositronSuccess.png) - - ---- - -# New Folder from Git - -::: {.fragment} -::: {.callout-tip title="."} -With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. - -To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option -::: -::: - ---- - -![](images/MacOS/24.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" -::: -::: - ---- - -![](images/FolderFromGit1.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. -::: -::: - ---- - -![](images/Import2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. -::: -::: - ---- - -![](images/MacOS/28.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And with that done, you should now see the forked Cytometry in R course contents appear within Positron. -::: -::: - ---- - -![](images/Import2Done.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" -::: -::: - ---- - -![](images/FolderFromGit2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. -::: -::: - ---- - -![](images/Import2.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. -::: -::: - ---- - -![](images/Import2Done.png) - - ---- - -# Wrap-up - -::: {.fragment} -::: {.callout-tip title="."} -In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. - -In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. -::: -::: - - ---- - -# Additional Resources - -[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Installing Software on Windows" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +::: {.fragment} +::: {.callout-tip title="."} +This is the software installation walkthrough for those whose computers are running Windows. Based on our pre-course interest form, you make up the majority of course participants. +::: +::: + +--- + +![](/course/00_WorkstationSetup/images/ComputerOS.png){width=100%} + +--- + +# Background + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this walkthrough, we will have you install the following pieces of software: + +[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. + +[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. + +[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. + +Additionally, Windows users will need to install: + +[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. +::: +::: + +# Getting Started + + +--- + +## Installing R + +::: {.fragment} +::: {.callout-tip title="."} +To get started, first navigate to the [R website](https://www.r-project.org/). Once there, click on [Download R](https://cran.r-project.org/mirrors.html) option towards the top of the page. +::: +::: + +--- + +![](images/Windows/01_RLanding.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the next screen, you will need to select a mirror from which to download the software from. You can either select the closest geographic location (which may be faster) or alternatively just select the [Cloud](https://cloud.r-project.org/) option which should redirect you. +::: +::: + +--- + +![](images/Windows/02_Landing.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then select your Operating System, in this case, [Windows](https://cloud.r-project.org/bin/windows/). +::: +::: + +--- + +![](images/Windows/03_ForWindows.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And go ahead and select the [Install R for the first time](https://cloud.r-project.org/bin/windows/base/) link. +::: +::: + +--- + +![](images/Windows/04_ForFirstTime.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, you will select the download the current version option at the top of the page. +::: +::: + +--- + +![](images/Windows/04_CurrentVersion.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The popup window will then ask where you want to save the installer (.exe) file. We generally save this to either Downloads or Desktop to make finding it easier. +::: +::: + +--- + +![](images/Windows/05_SaveTheInstaller.png) + + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After the download is complete, double click on the installer's .exe file. This will open a popup asking you to select your preferred language. +::: +::: + +--- + +![](images/Windows/07_DesiredLanguage.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to acccept the software license (which is the free copyleft GPL2 license, which we will learn about later in the course). +::: +::: + +--- + +![](images/Windows/08_GPL2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On Windows, R will normally save it's software folder under Program Files. +::: +::: + +--- + +![](images/Windows/09_ProgramFiles.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, please accept the defaults. +::: +::: + +--- + +![](images/Windows/10_Defaults.png) + + +--- + + +![](images/Windows/11_Defaults.png) + +--- + +![](images/Windows/12_Defaults.png) + +--- + +![](images/Windows/13_Defaults.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the defaults accepted, the installation will commence. Feel free to go have a coffee/tea/beverage-of-your choice break while you wait. +::: +::: + +--- + +![](images/Windows/14_Install.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all goes well, the installation will complete without any issues. +::: +::: + +--- + +![](images/Windows/15_Success.png) + + +--- + +## Installing RTools + +::: {.fragment} +::: {.callout-tip title="."} +We will now work on installing Rtools. This software is needed when building R packages from source, which we will need throughout the course for R packages hosted on GitHub. + +To get started, we will return to the [R installation](https://cloud.r-project.org/) page we visited previously and instead click on the [Rtools](https://cloud.r-project.org/bin/windows/Rtools/) option. +::: +::: + +--- + +![](images/Windows/16_Rtools.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, select the most recent version of Rtools to Download. +::: +::: + +--- + +![](images/Windows/17_RtoolsRecent.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then select for your architecture. For the vast majority of Windows users, your computer will likely be be using a x86 chip architecture, so you would select the Rtools45 installer option. + +If your computer however uses the ARM chip architecture, you would select the 64-bit ARM Rtools45 installer instead. If you are unsure, see the [following](https://youtu.be/Z_lcEqomG0k?si=U0fd7sHTZhCJroSm). +::: +::: + +--- + +![](images/Windows/18_64x86.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, you will select the location to save the Rtools installer to. We generally save this to either Downloads or Desktop to make finding it easier. +::: +::: + +--- + +![](images/Windows/17_Downloads.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once downloaded, double click on the .exe to launch the Rtools installer. +::: +::: + +--- + +![](images/Windows/19_RtoolsInstall.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to what we did when installing R, go ahead and keep the defaults. +::: +::: + +--- + +![](images/Windows/20_RtoolsDefaults.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And click install to proceed with the installation. +::: +::: + +--- + +![](images/Windows/21_RtoolsDefaults.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And wait while the installation wraps up. +::: +::: + +--- + +![](images/Windows/22_Download.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If all goes well, you should see the following installation success page. +::: +::: + +--- + +![](images/Windows/24_Rtools.png) + + +--- + +## Installing Git + +::: {.fragment} +::: {.callout-tip title="."} +[Git](https://git-scm.com/) is a version control software widely used among software developers and bioinformaticians. We will use it extensively throughout the course, both locally on our computers (to keep track of changes to our files), as well as in combination with [GitHub](https://github.com/)(to maintain online backups of our files). + +We will first navigate to the [website](https://git-scm.com/) and select the download from Windows option. +::: +::: + +--- + +![](images/Windows/01_Git.png){fig-align="center" width="600"} + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will then proceed and select [install 64-bit Git for Windows Setup]{.underline} option +::: +::: + +--- + +![](images/Windows/02_Git.png){fig-align="center" width="600"} + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As was the case with our installation of R and Rtools, a pop-up will appear asking for a location to save the installer to. + +Once downloaded, double-click and proceed with the installation. + +You will be asked to accept the Git License (which is the free copyleft GPL2 license, which we will learn about later in the course). +::: +::: + +--- + +![](images/Windows/02_GitLicense.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then you will be asked to select the folder to save to software to (usually your Programs folder) +::: +::: + +--- + +![](images/Windows/03_GitDestination.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +At this point, the Git installer will ask a series of increasingly niche questions. It is best to just accept all the default options, to avoid wandering too far down a ["What is Vim?!?"](https://www.vim.org/) rabbit-hole. +::: +::: + +--- + +![](images/Windows/04_GitComponents.png) + + +--- + +![](images/Windows/05_GitStartMenu.png) + +--- + +![](images/Windows/06_GitWhatsVim.png) + + +--- + +![](images/Windows/07_GitDecide.png) + +--- + +![](images/Windows/08_GitCommandLine.png) + + +--- + +![](images/Windows/09_GitBundledSSH.png) + +--- + +![](images/Windows/10_GitHTTPS.png) + +--- + +![](images/Windows/11_GitUnix.png) + +--- + +![](images/Windows/12_GitEmulator.png) + +--- + +![](images/Windows/13_GitPull.png) + +--- + +![](images/Windows/14_GitCredentialManager.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having made it through all the niche customization screens, we finally reach the install button. +::: +::: + +--- + +![](images/Windows/15_GitFileCatch.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We then can wait for the install to complete. +::: +::: + +--- + +![](images/Windows/16_GitInstalling.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And success, we have now installed Git. +::: +::: + +--- + +![](images/Windows/17_GitInstalled.png) + + +--- + + +## Installing Positron + +::: {.fragment} +::: {.callout-tip title="."} +Finally, you will install [Positron](https://positron.posit.co/). It is an integrated development environment (IDE) in which we will open, modify and run our code throughout the course. + +First, navigate to their [homepage](https://positron.posit.co/), and select the blue Download option button on the upper-right. +::: +::: + +--- + +![](images/Windows/25_Positron.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then need to accept the Elastic License agreement to use the software (we will cover this source-available license type and what it does later in the course). + +With the license accepted, you will be able to select your operating system. In this case, we will select Windows, specifally the user level install. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +![](images/Windows/26_UserInstall.png) +::: +::: + +--- + +Please note, if you are using a Windows computer with an ARM based chip (like is the case with Snapdragons), you will need to download the installed from the Positron's GitHub [Release Page](), as they are still testing some features. + +--- + +![](images/Windows/WindowsArm.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to select the location you want to save the installer to. We will generally save this to either Downloads or Desktop to make finding it easier. +::: +::: + +--- + +![](images/Windows/27_InstallerLocation.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once the download is complete, double click on the installer, and again accept the license agreement. +::: +::: + +--- + +![](images/Windows/28_Elastic.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Generally, Positron will be store its software folder under Program Files. +::: +::: + +--- + +![](images/Windows/29_SaveLocation.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next up, accept the default options for the following screens +::: +::: + +--- + +![](images/Windows/30_Defaults.png) + +--- + +![](images/Windows/31_Defaults.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And finally, click Install. +::: +::: + +--- + +![](images/Windows/32_Defaults.png) + +--- + +![](images/Windows/34_Install.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If all goes well, you should then see the installation success page. +::: +::: + +--- + +![](images/Windows/35_Success.png) + + +--- + +# Connecting GitHub and Positron + +::: {.fragment} +::: {.callout-tip title="."} +Now that you have all the software installed, we need to make sure that everything is communicating properly with each other. To do this, we will start by making sure your GitHub account and Positron are connected. + +When opening Positron for the first time, you will encounter the following view: +::: +::: + +--- + +![](images/Windows/36_PositronLanding.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will go over the various aspects of using Positron in the next [section](/course/00_Positron/index.qmd). For now select the "Start Session" button on the upper right, and then select the most recent/up-to-date R version. +::: +::: + +--- + +![](images/Windows/37_AllHiddenCondas.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +R will proceed to activate, and you will see a message appear in the bottom center window (ie. console) +::: +::: + +--- + +![](images/Windows/38_Loaded.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Congratulations, we now know R is working correctly. Next up, connecting your GitHub account to Positron. To make this process easier, first log into your [GitHub](https://github.com/) account from your preferred web browser. + +Once this is done, return to Positron, and click on the profile Icon and select "Sign with GitHub" option. +::: +::: + +--- + +![](images/Windows/39_GitHubSetup.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Positron will provide a popup containing a code you will need to give to GitHub to set up authentication. Proceed to click on the "Copy & Continue to GitHub" button. +::: +::: + +--- + +![](images/Windows/40_Code.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you are already signed in, it will ask which account you want to connect Positron with. Select your GitHub account. +::: +::: + +--- + +![](images/Windows/41_GitHub.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will then be prompted to paste the one-time code provided by Positron. Once pasted, click on Continue. +::: +::: + +--- + +![](images/Windows/42_GitHubPassword.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And select "Authorize posit-dev" to authorize Positron to interact with your GitHub Account. +::: +::: + +--- + +![](images/Windows/43_GitHubSetup.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Depending on your computer settings, you may be asked for your two-factor authorization passkey. If so, complete this step. +::: +::: + +--- + +![](images/Windows/44_Passkey.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And if all works out, you should see the following succes page +::: +::: + +--- + +![](images/Windows/45_PasskeySuccess.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Returning to Positron, check the profile tab on the lower left and verify that it now shows your GitHub account. If it does, congrats! If not, close Positron, check the tab again, and repeat the above one-time code steps if needed. +::: +::: + +--- + +![](images/Windows/46_PositronSuccess.png) + + +--- + +# New Folder from Git + +::: {.fragment} +::: {.callout-tip title="."} +With [GitHub](https://github.com/) and Positron now connected, we will bring your two repositories (the README and the fork of CytometryInR) from GitHub to your local computer. + +To this, first navigate to the Folder icon on the upper-right, and select the "New Folder from Git" option +::: +::: + +--- + +![](images/MacOS/24.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Lets first bring in your forked version of the Cytometry in R repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username in place of UMGCCCFCSR in "https://github.com/UMGCCCFCSR/CytometryInR" +::: +::: + +--- + +![](images/FolderFromGit1.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will also be asked for a location to store your project folder. It is best to save the folder locally (avoid using OneDrive or other cloud locations for now), as it makes things easier to save or modify without running into permission issues. For most of our course examples, we will be saving our Project Folders under the Documents Folder. +::: +::: + +--- + +![](images/Import2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You may encounter a pop-up asking whether you trust the authors for that particular folder. For your own projects, you are the author, so go ahead and select Yes. Selecting No is a good precaution when bringing in a random GitHub project that you haven't had time to properly vet. +::: +::: + +--- + +![](images/MacOS/28.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And with that done, you should now see the forked Cytometry in R course contents appear within Positron. +::: +::: + +--- + +![](images/Import2Done.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will now repeat the process to bring in youir GitHub profile's ReadMe repository. Depending on your GitHub username, you would either need to copy the URL from your browser, or swap in your username twice in place for each UMGCCCFCSR: "https://github.com/UMGCCCFCSR/UMGCCCFCSR" +::: +::: + +--- + +![](images/FolderFromGit2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +After pasting the URL, and selecting the folder to save your project folder to (Documents in our case), select OK. +::: +::: + +--- + +![](images/Import2.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And after a quick import you should now see your ReadMe repository files available and ready to be modified on your local computer. +::: +::: + +--- + +![](images/Import2Done.png) + + +--- + +# Wrap-up + +::: {.fragment} +::: {.callout-tip title="."} +In this walkthrough, we installed R, Rtools, Git and Positron. We also made sure to connect Positron and your GitHub account, and brought copies of your repositories into local project folders. With this, you now have on your workstation the major pieces of software needed for the course. + +In the [next section](/course/00_Positron/), we will delve into how to use Positron, and explore more how to use the connection you set up with GitHub to send [changes](/course/00_Git/) from your local repositories back to GitHub. +::: +::: + + +--- + +# Additional Resources + +[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/00_WorkstationSetup/images/.DS_Store b/course/00_WorkstationSetup/images/.DS_Store deleted file mode 100644 index 14ba08b..0000000 Binary files a/course/00_WorkstationSetup/images/.DS_Store and /dev/null differ diff --git a/course/00_WorkstationSetup/images/MacOS/.DS_Store b/course/00_WorkstationSetup/images/MacOS/.DS_Store deleted file mode 100644 index 3278aca..0000000 Binary files a/course/00_WorkstationSetup/images/MacOS/.DS_Store and /dev/null differ diff --git a/course/00_WorkstationSetup/index.qmd b/course/00_WorkstationSetup/index.qmd index 523b9f2..5f2be3e 100644 --- a/course/00_WorkstationSetup/index.qmd +++ b/course/00_WorkstationSetup/index.qmd @@ -1,86 +1,86 @@ ---- -title: "Workstation Setup" -author: "David Rach" -date: 01-17-2026 -format: html -toc: true -toc-depth: 4 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -In the previous [section](/course/00_GitHub/index.qmd), we first set up your [GitHub](https://github.com/) account. Then we modified your GitHub profile and added a README section. Finally, we forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. - -It is now time to install the required software on your computer, which will get your work-station set up with everything needed for this course. Depending on your computers operating system, the installation requirements may differ a bit. In general, you will need to install the following software: - -[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. - -[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. - -[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. - -Additionally, Windows users will need to install: - -[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. - -You can find the operating system specific installation walkthroughs below. Once you have completed your specific walkthrough, return to this page and proceed to the [next section](/course/00_Positron/). - -***Please note:*** For those using university or company administered computers, please be aware that you may not have the necessary permissions to install these directly, and may need to reach out to your IT department to help get the software installed and running correctly. - -If you are using your own computer, congratulations, you are your system administrator, and should already have the necessary permissions. - -# Install Software for - -## Windows - -![](https://winaero.com/blog/wp-content/uploads/2021/06/Windows-11-Win-X-Menu-icon.png){width=25%} - -Installation walkthrough for [Windows](Windows.qmd) - -
- ---- - -## MacOS - -![](https://substackcdn.com/image/fetch/$s_!G1lk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed3d547-94ff-48e1-9f20-8c14a7030a02_2000x2000.jpeg){width=25%} - -Installation walkthrough for [MacOS](MacOS.qmd) - -
- ---- - -## Linux (Debian) - -![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTAx6camOf_G96Zcs2Zj34Yjmy0ysPd-p0oJQ&s){width=25%} - -Installation walkthrough for [Linux](Linux.qmd) - -
- ---- - -# Additional Resources - -[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) - -[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) - -[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) - -[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) - -[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) - -[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) - - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "Workstation Setup" +author: "David Rach" +date: 01-17-2026 +format: html +toc: true +toc-depth: 4 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +In the previous [section](/course/00_GitHub/index.qmd), we first set up your [GitHub](https://github.com/) account. Then we modified your GitHub profile and added a README section. Finally, we forked the [CytometryInR](https://github.com/UMGCCCFCSR/CytometryInR/) repository so that you can easily retrieve the new course materials each week. + +It is now time to install the required software on your computer, which will get your work-station set up with everything needed for this course. Depending on your computers operating system, the installation requirements may differ a bit. In general, you will need to install the following software: + +[R website](https://www.r-project.org/) : The programming language we will be using throughout the course. + +[Positron](https://positron.posit.co/) : The integrated development environment (IDE) in which we will open, modify and run our code. + +[Git](https://git-scm.com/) : The version control software that will allow us to track changes to our files. + +Additionally, Windows users will need to install: + +[RTools](https://cran.r-project.org/bin/windows/Rtools/rtools45/rtools.html) : Used to build R packages from source code. + +You can find the operating system specific installation walkthroughs below. Once you have completed your specific walkthrough, return to this page and proceed to the [next section](/course/00_Positron/). + +***Please note:*** For those using university or company administered computers, please be aware that you may not have the necessary permissions to install these directly, and may need to reach out to your IT department to help get the software installed and running correctly. + +If you are using your own computer, congratulations, you are your system administrator, and should already have the necessary permissions. + +# Install Software for + +## Windows + +![](https://winaero.com/blog/wp-content/uploads/2021/06/Windows-11-Win-X-Menu-icon.png){width=25%} + +Installation walkthrough for [Windows](Windows.qmd) + +
+ +--- + +## MacOS + +![](https://substackcdn.com/image/fetch/$s_!G1lk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ed3d547-94ff-48e1-9f20-8c14a7030a02_2000x2000.jpeg){width=25%} + +Installation walkthrough for [MacOS](MacOS.qmd) + +
+ +--- + +## Linux (Debian) + +![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTAx6camOf_G96Zcs2Zj34Yjmy0ysPd-p0oJQ&s){width=25%} + +Installation walkthrough for [Linux](Linux.qmd) + +
+ +--- + +# Additional Resources + +[How to Download and Install Software on Windows 11](https://youtu.be/IEhnWKZB4p4?t=60) + +[How to Install Software on a Mac](https://youtu.be/OH6cSQikbdw?si=ywXBU_eD2kl9AnLU) + +[How to Download and Install Software on Linux](https://youtu.be/lC4d4EpMMxg?si=9TeFkwFzrRbzA-Ma) + +[Riffomonas Project: Installing R, RStudio, and packages for Windows and Mac OS X (CC077)](https://youtu.be/D6CunpqF04E?si=jeU6-XiSRj-ygDf_) + +[A brief tour of Positron](https://posit.co/blog/a-quick-tour-of-positron/) + +[A brief introduction to Git for beginners](https://youtu.be/r8jQ9hVA2qs?si=jNastI7kNiGHHG9O) + + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/01_InstallingRPackages/homeworks/README.md b/course/01_InstallingRPackages/homeworks/README.md index 2818b5e..fe53443 100644 --- a/course/01_InstallingRPackages/homeworks/README.md +++ b/course/01_InstallingRPackages/homeworks/README.md @@ -1,5 +1,5 @@ -# Turning In Optional Take-Home Problems - -This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. - +# Turning In Optional Take-Home Problems + +This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. + Within your branch, inside this "homeworks" folder, create a new folder (name it with your GitHub username). Then copy all files you will be submitting within your folder. Then commit the change to git, and push to GitHub. See [Getting Help](/course/00_Homeworks/index.qmd)for details on submitting the pull request to the UMGCCCFCSR/CytometryInR homework branch. \ No newline at end of file diff --git a/course/01_InstallingRPackages/homeworks/claude-chew/Week1_Homework.qmd b/course/01_InstallingRPackages/homeworks/claude-chew/Week1_Homework.qmd new file mode 100644 index 0000000..d748c0a --- /dev/null +++ b/course/01_InstallingRPackages/homeworks/claude-chew/Week1_Homework.qmd @@ -0,0 +1,83 @@ +--- +title: "Week1 Homework" +format: html +--- + +# Problem 1: PeacoQC functions: + +# These are all arguments, not functions +ff +channels +determine_good_cells +plot +save_fcs +output_directory +name_directory +report +events_per_bin +min_cells +max_bins +step +MAD +IT_limit +consecutive_bins +remove_zeros +suffix_fcs +force_IT +peak_removal +min_nr_bins_peakdetection +time_channel_parameter + +# PeacoQC also has a Heatmap function - PeacoQCHeatmap() that contains: +# These are all aguments, not functions +report_location +show_values +show_row_names +latest_tests +title + +And you can add extra parameters to the heatmap function. + +You can also plot the deleted cells from running PeacoQC using PlotPeacoQC() + +Preprocessing functions to PeacoQC are: + +PeacoQC +PeacoQCHeatmap +PlotPeacoQC +RemoveDoublets() +RemoveMargins() + + +# Problem 2: 1. How many cytometry packages are currently in Bioconductor and the 2. author/maintainer with the most contributed cytometry R packages. 3. Couple of packages to explore later in the course + +1. There are 69 cytometry packages currently in Bioconductor +2. Mike Jiang +3. cytoMEM, FlowSOM + +# Problem 3: Using pak to install “broom”, “cytoMEM”, “DillonHammill/CytoExploreR”. + +First thing I had to do was install pak itself from CRAN using install.packages("pak") +Then, using pak to install these packages meant that I had to call the pkg_install function from pak using the pak::pkg_install() command. It generated a different string of installation commands for each package installed. + +I ran into a problem attempting to install CytoExploreR. I had to specifically call for a version 1.0.0 of the package "superheat" from GitHub, that was a dependency of CytoExploreR. Once I had that installed, CytoExploreR successfully installed using pak. + +Code used for this is below. + +```{r} +install.packages("pak") +library(pak) +pak::pkg_install("broom") +pak::pkg_install("cytoMEM") + + + +# Install superheat 1.0.0 from GitHub +pak::pkg_install("rlbarter/superheat") +pak::pkg_install("DillonHammill/CytoExploreR") +``` + + +![Installing Broom](installing_broom.png) +![Installing cytoMEM](installing_cytoMEM.png) +![Installing CytoExploreR](installing_CytoExploreR.png) \ No newline at end of file diff --git a/course/01_InstallingRPackages/homeworks/claude-chew/installing_CytoExploreR.png b/course/01_InstallingRPackages/homeworks/claude-chew/installing_CytoExploreR.png new file mode 100644 index 0000000..06f22cc Binary files /dev/null and b/course/01_InstallingRPackages/homeworks/claude-chew/installing_CytoExploreR.png differ diff --git a/course/01_InstallingRPackages/homeworks/claude-chew/installing_broom.png b/course/01_InstallingRPackages/homeworks/claude-chew/installing_broom.png new file mode 100644 index 0000000..e5fd813 Binary files /dev/null and b/course/01_InstallingRPackages/homeworks/claude-chew/installing_broom.png differ diff --git a/course/01_InstallingRPackages/homeworks/claude-chew/installing_cytoMEM.png b/course/01_InstallingRPackages/homeworks/claude-chew/installing_cytoMEM.png new file mode 100644 index 0000000..2729f9e Binary files /dev/null and b/course/01_InstallingRPackages/homeworks/claude-chew/installing_cytoMEM.png differ diff --git a/course/01_InstallingRPackages/homeworks/claude-chew/installing_superheat.png b/course/01_InstallingRPackages/homeworks/claude-chew/installing_superheat.png new file mode 100644 index 0000000..0f04aaf Binary files /dev/null and b/course/01_InstallingRPackages/homeworks/claude-chew/installing_superheat.png differ diff --git a/course/01_InstallingRPackages/index.qmd b/course/01_InstallingRPackages/index.qmd index 0cb7f8a..6c9f198 100644 --- a/course/01_InstallingRPackages/index.qmd +++ b/course/01_InstallingRPackages/index.qmd @@ -1,1337 +1,1337 @@ ---- -title: "01 - Installing R Packages" -author: "David Rach" -date: 02-01-2026 -format: html -toc: true -toc-depth: 5 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://youtube.com/live/ZNFNokzsBaM) - - - -For screen-shot slides, click [here](/course/01_InstallingRPackages/slides.qmd) - -```{r} -#| include: FALSE -library(BiocStyle) -``` - -Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. - -Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/) and [Workstation Setup](/course/00_WorkstationSetup/) walk-throughs, since we will begin where they left off once the required software was successfully installed. - -:::{.callout-important} -Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. -::: - -
- ---- - -# Background - -During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. - -This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. - -
- ---- - -Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). - -Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. - -
- ---- - -:::{.callout-tip} -R packages can also just be made for fun! Among my favorite examples of this, there is an R package that lets you add the snake game to your [recalculating screen](https://github.com/AdamSpannbauer/snakeLoadR), as well as R packages that provide the color-palette schemes needed to make your plots with [Studio Ghibli](https://github.com/ewenme/ghibli), [Wes Anderson](https://github.com/karthik/wesanderson), or [Bluey](https://github.com/ekholme/blueycolors) colors. -::: - -
- ---- - -These R packages start off as [source code](https://r-pkgs.org/structure.html#sec-package-states) (which is what we will be learning to write during this course). When you install a R package to your computer, this human-readable source code gets converted into a binary format with which your computer can interact directly. - -
- ---- - -Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. - -
- ---- - -To make distributing the thousands of R packages and their associated package dependencies easier, R packages are collected (ie. hosted) within **repositories**, which function as an intermediate distributor. - -The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. - -
- ---- - -The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). - -
- ---- - -In this session, we will work on installing the various R packages we will need through the course. While doing so, we will explore how to figure out which repository the individual package is in; what installation commands to use to download it; and how to look up the help documentation. We will also touch on how the functions within an R package are made available for our computer to use (via the `library()` call), and how to troubleshoot the more commonly encountered installation errors. - -
- ---- - -# Getting Started - -## Set Up - -Alright, with the background out of the way, let's get started! - -:::{.callout-important} -Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. -::: - -:::{.callout-warning} -Please remember to always copy over the new material from your local CytometryInR folder to a separate Project Folder that you created and named (ex. "Week_01" or "MyLearningFolder", etc.). This will ensure any edits you make to the files do not affect your ability to bring in next week's materials to the CytometryInR folder -::: - -
- ---- - -After pulling the new data and code locally, open CytometryInR, open the course folder, and open the 01_InstallingRPackages folder. From here, copy the **index.qmd** file to your own working Project Folder (ex. Week_01) where you can work on it without causing any conflicts. Then return to Positron and open up your working project folder (ex. Week_01). - -![](images/01_Interpreter.png) - -
- ---- - -Next up, within [Positron](/course/00_Positron/index.qmd#interpreter), let's make sure to select R as the coding language being used for this session. - -![](images/01_Interpreter.png) - -
- ---- - -Now that R is running within Positron, the console (lower portion of the screenn) is now able to run (ie. execute) any R code that is sent to it. - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -## Checking for Loaded Packages - -For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. - -
- ---- - -### Accessing Help Documentation - -Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function: - -```{r} -#| eval: FALSE -sessionInfo() -``` - -
- ---- - -If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. - -![](images/02_HelpHover.png) - -
- ---- - -In this case, we can see the help documentation corresponding for `sessionInfo()`. Beyond hovering over the function, this can also be accessed by adding a ? directly in front of the function, and then running that line of code. - -```{r} -#| eval: FALSE -?sessionInfo() -``` - -![](images/03_QuestionMark.png) - -
- ---- - -When executed, the function's help file documentation will open up within the Help tab in the secondary side bar on the right-side of the screen. Glancing at the top of the page we can see the name of the package that contains the `sessionInfo()` function (`{utils}`). Scrolling down the help page past all the documentation, we can see a link to the index page. - -![](images/04_Index.png) - -
- ---- - -After clicking, the Help tab switches from viewing the documentation for the `sessionInfo()` function, to showing all the functions within the `utils` package. Most R packages contain help documentation, so this process can be adapted to find out additional information about what a function does, and what arguments are needed to produce customized outputs. - -![](images/05_UtilsFunctions.png) - - -
- ---- - -### sessionInfo() - -Within your .qmd file, let's go ahead and run the following code-block: - -```{r} -sessionInfo() -``` - -
- ---- - -The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. - -For today, let's focus on the last two elements of the output: - -![](images/06_sessionInfo.png) - -
- ---- - -The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. - -As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. - -
- ---- - -## Installing from CRAN - -We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. - -These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. - -
- ---- - -### dplyr - -Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. - -```{r} -#| eval: FALSE -?install.packages() -``` - -![](images/07_InstallPackages.png) - -
- ---- - -For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - -
- ---- - -:::{.callout-tip} -A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. -::: - -```{r} -#| error: TRUE - -install.packages(dplyr) -``` - -
- ---- - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - - -Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. - -
- ---- - -When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). - -![](images/08_InstallScript.png) - -
- ---- - -Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. - -If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. - -![](images/09_InstallScript2.png) - -
- ---- - -The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). - -
- ---- - -### Attaching packages via library() - -If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. - -```{r} -#| eval: FALSE -?library() -``` - -
- ---- - -Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. - -```{r} -library(dplyr) -``` - -
- ---- - -From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. - -With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. - -```{r} -sessionInfo() -``` - -
- ---- - -Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. - -```{r} -#| eval: FALSE -?select -``` - -![](images/10_Attached.png) - -
- ---- - -Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. - -By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. - -```{r} -?ggplot -``` - -
- ---- - -Beyond individual functions, some R packages also have help landing pages, that can be similarly accessed by adding a ? in front of the package name: - -![](images/11_PackageLanding.png) - -
- ---- - -### Unattaching - -So far, we have installed an R package, and then attached it (via `library()`). How would we reverse these steps? - -Well, to unload it from the local environment, there are a couple options. You could of course simply shut down Positron. The local environment only exist in context of when you open and close the session, which closing the program will do. All previously loaded R packages will be unattached, which is why when you start a new session you will need to load in all packages you plan on using via `library()`. - -Alternatively, although less used, you could `detach()` it via your console: - -```{r} -detach("package:dplyr", unload=TRUE) -``` - -```{r} -sessionInfo() -``` - -
- ---- - -Looking at the `sessionInfo()` output, dplyr is no longer attached to the local environment. Consequently, if we try to once again look for the documentation, no information will be retrieved. - -```{r} -?dplyr -``` - -
- ---- - -There is a workaround however, if we want to access functions from an unloaded R package. We can specify the R package's name, followed by two :, and then the function name. The :: conveys the context to your computer that the package is present, but may not be attached. - -```{r} -#| eval: FALSE -?dplyr::select() -``` - -This particular use case can be useful if we want to run a particular function, but not load in all a packages functions (which may have identical function names to other R packages we are using and cause some conflicts). - -
- ---- - -### Removing Packages - -Just as we can install an R package, we can also uninstall an R package (although doing so is rare, most often when encountering package dependency conflict). To do so, we would use the `remove.packages()` function. - -```{r} -#| eval: FALSE -?remove.packages() -``` - -```{r} -#| eval: FALSE -remove.packages("dplyr") -``` - -This results in the package being removed entirely from our computer. We would then need to reinstall it if needed in the future. - -
- ---- - -### Common Issues - -As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? - -To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). - -```{r} -install.packages("PeacoQC") -``` - -
- ---- - -As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. - -This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. - -
- ---- - -## Installing from Bioconductor - -**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. - -Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. - -
- ---- - -To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. - -```{r} -#| eval: FALSE -install.packages("BiocManager") -``` - -
- ---- - -Once BiocManager is installed, we can attach it to our local environment using the `library()` function - -```{r} -library(BiocManager) -``` - -
- ---- - -When loaded, you will see an output showing the current Bioconductor and R versions. - -We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. - -:::{.callout-tip} -As always, don't forget the "" when running an `install()` command. -::: - -```{r} -#| eval: FALSE -?install() -``` - -```{r} -#| eval: FALSE - -install("PeacoQC") -``` - -
- ---- - -We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. - -:::{.callout-note} -Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process -::: - -![](images/12_PeacoQCDependencies.png) - -
- ---- - -Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. - -![](images/13_rjson.png) - -
- ---- - -This process continues for each dependency being installed. - -![](images/13b_Other.png) - -
- ---- - -And finally, once all the dependencies are installed, `PeacoQC` starts to install. - -![](images/13c_PeacoQC.png) - -
- ---- - -Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. - -![](images/14_UpdateAll.png) - -
- ---- - -Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. - -![](images/16_GitHubInstall.png) - -
- ---- - -Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. - -![](images/14_UpdateAll.png) - -
- ---- - -With PeacoQC has been installed, we can load it via the `library()` call - -:::{.callout-tip} -Remeber, `library()` doesn't require " " -::: - -```{r} -library(PeacoQC) -``` - -
- ---- - -And we can check to see if it has been attached to the local environment - -```{r} -sessionInfo() -``` - -
- ---- - -As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. - -![](images/15_AdditionalDependencies.png) - -
- ---- - -To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. - -```{r} -#| eval: FALSE - -installed.packages() -``` - -
- ---- - -## Install from GitHub - -In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. - -
- ---- - -While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). - -
- ---- - -To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. - -:::{.callout-tip title="Spot Check #1"} -To install a package from CRAN, what function would you use? -Click on the code-fold arrow below to reveal the answer. -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -install.packages("remotes") -``` - -
- ---- - -With the `remotes` package now installed, we can attach it to our local environment. - -:::{.callout-tip title="Spot Check #2"} -What function would be used to do so? -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -library(remotes) -``` - -
- ---- - -And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. - -:::{.callout-tip title="Spot Check #3"} -How would you look up the help documentation for this function? -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Either by hovering over it within Positron or via - -?install_github() -``` - -
- ---- - -We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. - -![](images/PE_Spectrum.png) - -
- ---- - -To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be: - -```{r} -#| eval: FALSE - -install_github("hally166/flowSpectrum") -``` - -
- ---- - -When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. - -This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). - -![](images/17_InstallSource.png) - -
- ---- - -## Troubleshooting Install Errors - -We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. - -When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. - -![](images/18_ErrorExample.png) - -
- ---- - -If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. - -
- ---- - -## Installing Specific-Package Versions - -While we may be tempted to think of R packages as static, they change quite often, as their develipers add new features, fix bugs, etc. To help keep track of these changes (essential for [reproducibility](https://www.nature.com/articles/d42473-019-00004-y) and replicability), R packages have version numbers. - -When we run `sessionInfo()`, we can see an example of this, with the version number appearing after the package name. - -```{r} -sessionInfo() -``` - -
- ---- - -Alternatively, we can retrieve the same information for the individual packages via the `packageVersion()` function - -```{r} -packageVersion("PeacoQC") -``` - -
- ---- - -As well as from the `citation()` function. - -```{r} -citation("PeacoQC") -``` - -
- ---- - -How does a version number work? Lets say we have the following version number: **1.20.0** - -The first number of the version (**1.** in this case) denotes major changes, primarily those where after the version change the package may not be compatible with the code used in the prior version. As a consequence, this number changes rarely. - -The second number (**.20.** in this case) is the minor version. Minor changes typically consist of new features that are added, that don't affect the overall package function. These will change more frequently, especially for Bioconductor packages with fixed [release cycles](https://www.bioconductor.org/developers/release-schedule/). - -The final number (**.0** in this case) is often used to denote small changes occuring within a minor release period, often bug-fixes or fixing typos within the documentation. - -
- ---- - -We may in the future need to install specific package versions (but wont be doing so today). As expected, which repository contains the R package influences how we would go about doing this. - -For CRAN packages, we can use the `remotes` packages `install_version()` function. This allows us to provide the version number, and designate the repository location (the CRAN url in this case). - -```{r} -#| eval: FALSE -remotes::install_version("ggplot2", version = "3.5.2", repos = "https://cloud.r-project.org") -``` - -For GitHub-based R packages, the package versioning schema is not as strict as that of CRAN or Bioconductor. Typically, changes in R packagaes are put out by their developers as [releases](https://github.com/DavidRach/Luciernaga/releases). When trying to install a particular release, we can add an additional argument to the `install_github()` function, specifying the release version's tag number. For example: - -```{r} -#| eval: FALSE -remotes::install_github("DavidRach/Luciernaga", ref = "v0.99.7") -``` - -Alternatively, if the developer doesn't implement releases, you can provide the hash number of a particular commit. - -```{r} -#| eval: FALSE - -remotes::install_github("DavidRach/Luciernaga", ref = "8d1d694") -``` - -## Documentation and Websites - -We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. - -For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr`: - -![](images/19_DplyrGoogle.png) - -
- ---- - -Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. - -![](images/20_DplyrCRAN.png) - -
- ---- - -Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) - -![](images/21_DplyrPkgdown.png) - -
- ---- - -We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. - -![](images/22_PkgdownArticles.png) - -
- ---- - -GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. - -![](images/23_GitHub.png) - -
- ---- - -For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): - -![](images/24_PeacoQCBioc.png) - -
- ---- - -Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. - -![](images/25_Vignettes.png) - -
- ---- - - -# Your Turn - -Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. - -:::{.callout-note} -To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. -::: - -:::{.callout-important} -Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. -::: - -:::{.callout-tip} -Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. - -For cases where you are truly stuck, expand the code-fold below each package name to see the answer. -::: - -:::{.callout-note} -Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. -::: - -Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. - -
- ---- - -:::{.callout-tip title="1/20"} -R package: purrr -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://purrr.tidyverse.org/ - -install.packages("purrr") -``` - -
- ---- - -:::{.callout-tip title="2/20"} -R package: flowCore -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html - -install("flowCore") -``` - -
- ---- - -:::{.callout-tip title="3/20"} -R package: flowWorkspace -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html - -install("flowWorkspace") -``` - -
- ---- - -:::{.callout-tip title="4/20"} -R package: stringr -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://stringr.tidyverse.org/ - -install.packages("stringr") -``` - -
- ---- - -:::{.callout-tip title="5/20"} -R package: ggplot2 -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://ggplot2.tidyverse.org/ - -install.packages("ggplot2") -``` - -
- ---- - - -:::{.callout-tip title="6/20"} -R package: ggcyto -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html - -install("ggcyto") -``` - -
- ---- - -:::{.callout-tip title="7/20"} -R package: tidyr -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://tidyr.tidyverse.org/ - -install.packages("tidyr") -``` - -
- ---- - -:::{.callout-tip title="8/20"} -R package: openCyto -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html - -install("openCyto") -``` - -
- ---- - -:::{.callout-tip title="9/20"} -R package: FlowSOM -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html - -install("FlowSOM") -``` - -
- ---- - -:::{.callout-tip title="10/20"} -R package: xml2 -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://xml2.r-lib.org/ - -install.packages("xml2") -``` - -
- ---- - - -:::{.callout-tip title="11/20"} -R package: saeyslab/CytoNorm -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: GitHub -# Website: https://github.com/saeyslab/CytoNorm - -install_github("saeyslab/CytoNorm") -``` - -
- ---- - -:::{.callout-tip title="12/20"} -R package: lubridate -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://lubridate.tidyverse.org/ - -install.packages("lubridate") -``` - -
- ---- - -:::{.callout-tip title="13/20"} -R package: httr2 -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://httr2.r-lib.org/ - -install.packages("httr2") -``` - -
- ---- - -:::{.callout-tip title="14/20"} -R package: flowGate -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html - -install("flowGate") -``` - -
- ---- - -:::{.callout-tip title="15/20"} -R package: devtools -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://devtools.r-lib.org/ - -install.packages("devtools") -``` - -
- ---- - -:::{.callout-tip title="16/20"} -R package: plotly -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://plotly.com/r/getting-started/ - -install.packages("plotly") -``` - -
- ---- - -:::{.callout-tip title="17/20"} -R package: biosurf/cyCombine -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: GitHub -# Website: https://github.com/biosurf/cyCombine - -install_github("biosurf/cyCombine") -``` - -
- ---- - -:::{.callout-tip title="18/20"} -R package: CytoML -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html - -install("CytoML") -``` - -
- ---- - -:::{.callout-tip title="19/20"} -R package: Rtsne -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://github.com/jkrijthe/Rtsne - -install.packages("Rtsne") -``` - -
- ---- - -:::{.callout-tip title="20/20"} -R package: uwot -::: - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website:https://jlmelville.github.io/uwot/ - -install.packages("uwot") -``` - -
- ---- - -**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. - -![](images/Entertained.jpg) - -Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). - -
- ---- - -# Wrap-Up - -In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. - -You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN](https://cran.r-project.org/) repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor](https://www.bioconductor.org/) repository. - -If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. - -Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. - -Until then, Best Wishes! - -- David - -
- -![](/course/01_InstallingRPackages/images/ExitImage.png) - ---- - -# Additional Resources - -[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An useful beginner-friendly blogpost covering additional aspects from a different perspective. - -[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. - -[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. - -
- ---- - - -# Take-home Problems - -Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. - -You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. - -:::{.callout-tip title="Problem 1"} -We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains -::: - -:::{.callout-tip title="Problem 2"} -Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. -::: - -:::{.callout-tip title="Problem 3"} -There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. - -After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". - -Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. -::: - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - +--- +title: "01 - Installing R Packages" +author: "David Rach" +date: 02-01-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://youtube.com/live/ZNFNokzsBaM) + + + +For screen-shot slides, click [here](/course/01_InstallingRPackages/slides.qmd) + +```{r} +#| include: FALSE +library(BiocStyle) +``` + +Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. + +Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/) and [Workstation Setup](/course/00_WorkstationSetup/) walk-throughs, since we will begin where they left off once the required software was successfully installed. + +:::{.callout-important} +Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. +::: + +
+ +--- + +# Background + +During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. + +This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. + +
+ +--- + +Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). + +Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. + +
+ +--- + +:::{.callout-tip} +R packages can also just be made for fun! Among my favorite examples of this, there is an R package that lets you add the snake game to your [recalculating screen](https://github.com/AdamSpannbauer/snakeLoadR), as well as R packages that provide the color-palette schemes needed to make your plots with [Studio Ghibli](https://github.com/ewenme/ghibli), [Wes Anderson](https://github.com/karthik/wesanderson), or [Bluey](https://github.com/ekholme/blueycolors) colors. +::: + +
+ +--- + +These R packages start off as [source code](https://r-pkgs.org/structure.html#sec-package-states) (which is what we will be learning to write during this course). When you install a R package to your computer, this human-readable source code gets converted into a binary format with which your computer can interact directly. + +
+ +--- + +Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. + +
+ +--- + +To make distributing the thousands of R packages and their associated package dependencies easier, R packages are collected (ie. hosted) within **repositories**, which function as an intermediate distributor. + +The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. + +
+ +--- + +The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). + +
+ +--- + +In this session, we will work on installing the various R packages we will need through the course. While doing so, we will explore how to figure out which repository the individual package is in; what installation commands to use to download it; and how to look up the help documentation. We will also touch on how the functions within an R package are made available for our computer to use (via the `library()` call), and how to troubleshoot the more commonly encountered installation errors. + +
+ +--- + +# Getting Started + +## Set Up + +Alright, with the background out of the way, let's get started! + +:::{.callout-important} +Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. +::: + +:::{.callout-warning} +Please remember to always copy over the new material from your local CytometryInR folder to a separate Project Folder that you created and named (ex. "Week_01" or "MyLearningFolder", etc.). This will ensure any edits you make to the files do not affect your ability to bring in next week's materials to the CytometryInR folder +::: + +
+ +--- + +After pulling the new data and code locally, open CytometryInR, open the course folder, and open the 01_InstallingRPackages folder. From here, copy the **index.qmd** file to your own working Project Folder (ex. Week_01) where you can work on it without causing any conflicts. Then return to Positron and open up your working project folder (ex. Week_01). + +![](images/01_Interpreter.png) + +
+ +--- + +Next up, within [Positron](/course/00_Positron/index.qmd#interpreter), let's make sure to select R as the coding language being used for this session. + +![](images/01_Interpreter.png) + +
+ +--- + +Now that R is running within Positron, the console (lower portion of the screenn) is now able to run (ie. execute) any R code that is sent to it. + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +## Checking for Loaded Packages + +For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. + +
+ +--- + +### Accessing Help Documentation + +Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function: + +```{r} +#| eval: FALSE +sessionInfo() +``` + +
+ +--- + +If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. + +![](images/02_HelpHover.png) + +
+ +--- + +In this case, we can see the help documentation corresponding for `sessionInfo()`. Beyond hovering over the function, this can also be accessed by adding a ? directly in front of the function, and then running that line of code. + +```{r} +#| eval: FALSE +?sessionInfo() +``` + +![](images/03_QuestionMark.png) + +
+ +--- + +When executed, the function's help file documentation will open up within the Help tab in the secondary side bar on the right-side of the screen. Glancing at the top of the page we can see the name of the package that contains the `sessionInfo()` function (`{utils}`). Scrolling down the help page past all the documentation, we can see a link to the index page. + +![](images/04_Index.png) + +
+ +--- + +After clicking, the Help tab switches from viewing the documentation for the `sessionInfo()` function, to showing all the functions within the `utils` package. Most R packages contain help documentation, so this process can be adapted to find out additional information about what a function does, and what arguments are needed to produce customized outputs. + +![](images/05_UtilsFunctions.png) + + +
+ +--- + +### sessionInfo() + +Within your .qmd file, let's go ahead and run the following code-block: + +```{r} +sessionInfo() +``` + +
+ +--- + +The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. + +For today, let's focus on the last two elements of the output: + +![](images/06_sessionInfo.png) + +
+ +--- + +The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. + +As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. + +
+ +--- + +## Installing from CRAN + +We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. + +These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. + +
+ +--- + +### dplyr + +Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. + +```{r} +#| eval: FALSE +?install.packages() +``` + +![](images/07_InstallPackages.png) + +
+ +--- + +For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + +
+ +--- + +:::{.callout-tip} +A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. +::: + +```{r} +#| error: TRUE + +install.packages(dplyr) +``` + +
+ +--- + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + + +Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. + +
+ +--- + +When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). + +![](images/08_InstallScript.png) + +
+ +--- + +Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. + +If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. + +![](images/09_InstallScript2.png) + +
+ +--- + +The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). + +
+ +--- + +### Attaching packages via library() + +If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. + +```{r} +#| eval: FALSE +?library() +``` + +
+ +--- + +Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. + +```{r} +library(dplyr) +``` + +
+ +--- + +From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. + +With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. + +```{r} +sessionInfo() +``` + +
+ +--- + +Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. + +```{r} +#| eval: FALSE +?select +``` + +![](images/10_Attached.png) + +
+ +--- + +Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. + +By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. + +```{r} +?ggplot +``` + +
+ +--- + +Beyond individual functions, some R packages also have help landing pages, that can be similarly accessed by adding a ? in front of the package name: + +![](images/11_PackageLanding.png) + +
+ +--- + +### Unattaching + +So far, we have installed an R package, and then attached it (via `library()`). How would we reverse these steps? + +Well, to unload it from the local environment, there are a couple options. You could of course simply shut down Positron. The local environment only exist in context of when you open and close the session, which closing the program will do. All previously loaded R packages will be unattached, which is why when you start a new session you will need to load in all packages you plan on using via `library()`. + +Alternatively, although less used, you could `detach()` it via your console: + +```{r} +detach("package:dplyr", unload=TRUE) +``` + +```{r} +sessionInfo() +``` + +
+ +--- + +Looking at the `sessionInfo()` output, dplyr is no longer attached to the local environment. Consequently, if we try to once again look for the documentation, no information will be retrieved. + +```{r} +?dplyr +``` + +
+ +--- + +There is a workaround however, if we want to access functions from an unloaded R package. We can specify the R package's name, followed by two :, and then the function name. The :: conveys the context to your computer that the package is present, but may not be attached. + +```{r} +#| eval: FALSE +?dplyr::select() +``` + +This particular use case can be useful if we want to run a particular function, but not load in all a packages functions (which may have identical function names to other R packages we are using and cause some conflicts). + +
+ +--- + +### Removing Packages + +Just as we can install an R package, we can also uninstall an R package (although doing so is rare, most often when encountering package dependency conflict). To do so, we would use the `remove.packages()` function. + +```{r} +#| eval: FALSE +?remove.packages() +``` + +```{r} +#| eval: FALSE +remove.packages("dplyr") +``` + +This results in the package being removed entirely from our computer. We would then need to reinstall it if needed in the future. + +
+ +--- + +### Common Issues + +As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? + +To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). + +```{r} +install.packages("PeacoQC") +``` + +
+ +--- + +As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. + +This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. + +
+ +--- + +## Installing from Bioconductor + +**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. + +Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. + +
+ +--- + +To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. + +```{r} +#| eval: FALSE +install.packages("BiocManager") +``` + +
+ +--- + +Once BiocManager is installed, we can attach it to our local environment using the `library()` function + +```{r} +library(BiocManager) +``` + +
+ +--- + +When loaded, you will see an output showing the current Bioconductor and R versions. + +We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. + +:::{.callout-tip} +As always, don't forget the "" when running an `install()` command. +::: + +```{r} +#| eval: FALSE +?install() +``` + +```{r} +#| eval: FALSE + +install("PeacoQC") +``` + +
+ +--- + +We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. + +:::{.callout-note} +Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process +::: + +![](images/12_PeacoQCDependencies.png) + +
+ +--- + +Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. + +![](images/13_rjson.png) + +
+ +--- + +This process continues for each dependency being installed. + +![](images/13b_Other.png) + +
+ +--- + +And finally, once all the dependencies are installed, `PeacoQC` starts to install. + +![](images/13c_PeacoQC.png) + +
+ +--- + +Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. + +![](images/14_UpdateAll.png) + +
+ +--- + +Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. + +![](images/16_GitHubInstall.png) + +
+ +--- + +Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. + +![](images/14_UpdateAll.png) + +
+ +--- + +With PeacoQC has been installed, we can load it via the `library()` call + +:::{.callout-tip} +Remeber, `library()` doesn't require " " +::: + +```{r} +library(PeacoQC) +``` + +
+ +--- + +And we can check to see if it has been attached to the local environment + +```{r} +sessionInfo() +``` + +
+ +--- + +As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. + +![](images/15_AdditionalDependencies.png) + +
+ +--- + +To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. + +```{r} +#| eval: FALSE + +installed.packages() +``` + +
+ +--- + +## Install from GitHub + +In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. + +
+ +--- + +While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). + +
+ +--- + +To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. + +:::{.callout-tip title="Spot Check #1"} +To install a package from CRAN, what function would you use? +Click on the code-fold arrow below to reveal the answer. +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +install.packages("remotes") +``` + +
+ +--- + +With the `remotes` package now installed, we can attach it to our local environment. + +:::{.callout-tip title="Spot Check #2"} +What function would be used to do so? +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +library(remotes) +``` + +
+ +--- + +And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. + +:::{.callout-tip title="Spot Check #3"} +How would you look up the help documentation for this function? +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Either by hovering over it within Positron or via + +?install_github() +``` + +
+ +--- + +We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. + +![](images/PE_Spectrum.png) + +
+ +--- + +To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be: + +```{r} +#| eval: FALSE + +install_github("hally166/flowSpectrum") +``` + +
+ +--- + +When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. + +This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). + +![](images/17_InstallSource.png) + +
+ +--- + +## Troubleshooting Install Errors + +We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. + +When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. + +![](images/18_ErrorExample.png) + +
+ +--- + +If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. + +
+ +--- + +## Installing Specific-Package Versions + +While we may be tempted to think of R packages as static, they change quite often, as their develipers add new features, fix bugs, etc. To help keep track of these changes (essential for [reproducibility](https://www.nature.com/articles/d42473-019-00004-y) and replicability), R packages have version numbers. + +When we run `sessionInfo()`, we can see an example of this, with the version number appearing after the package name. + +```{r} +sessionInfo() +``` + +
+ +--- + +Alternatively, we can retrieve the same information for the individual packages via the `packageVersion()` function + +```{r} +packageVersion("PeacoQC") +``` + +
+ +--- + +As well as from the `citation()` function. + +```{r} +citation("PeacoQC") +``` + +
+ +--- + +How does a version number work? Lets say we have the following version number: **1.20.0** + +The first number of the version (**1.** in this case) denotes major changes, primarily those where after the version change the package may not be compatible with the code used in the prior version. As a consequence, this number changes rarely. + +The second number (**.20.** in this case) is the minor version. Minor changes typically consist of new features that are added, that don't affect the overall package function. These will change more frequently, especially for Bioconductor packages with fixed [release cycles](https://www.bioconductor.org/developers/release-schedule/). + +The final number (**.0** in this case) is often used to denote small changes occuring within a minor release period, often bug-fixes or fixing typos within the documentation. + +
+ +--- + +We may in the future need to install specific package versions (but wont be doing so today). As expected, which repository contains the R package influences how we would go about doing this. + +For CRAN packages, we can use the `remotes` packages `install_version()` function. This allows us to provide the version number, and designate the repository location (the CRAN url in this case). + +```{r} +#| eval: FALSE +remotes::install_version("ggplot2", version = "3.5.2", repos = "https://cloud.r-project.org") +``` + +For GitHub-based R packages, the package versioning schema is not as strict as that of CRAN or Bioconductor. Typically, changes in R packagaes are put out by their developers as [releases](https://github.com/DavidRach/Luciernaga/releases). When trying to install a particular release, we can add an additional argument to the `install_github()` function, specifying the release version's tag number. For example: + +```{r} +#| eval: FALSE +remotes::install_github("DavidRach/Luciernaga", ref = "v0.99.7") +``` + +Alternatively, if the developer doesn't implement releases, you can provide the hash number of a particular commit. + +```{r} +#| eval: FALSE + +remotes::install_github("DavidRach/Luciernaga", ref = "8d1d694") +``` + +## Documentation and Websites + +We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. + +For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr`: + +![](images/19_DplyrGoogle.png) + +
+ +--- + +Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. + +![](images/20_DplyrCRAN.png) + +
+ +--- + +Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) + +![](images/21_DplyrPkgdown.png) + +
+ +--- + +We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. + +![](images/22_PkgdownArticles.png) + +
+ +--- + +GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. + +![](images/23_GitHub.png) + +
+ +--- + +For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): + +![](images/24_PeacoQCBioc.png) + +
+ +--- + +Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. + +![](images/25_Vignettes.png) + +
+ +--- + + +# Your Turn + +Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. + +:::{.callout-note} +To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. +::: + +:::{.callout-important} +Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. +::: + +:::{.callout-tip} +Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. + +For cases where you are truly stuck, expand the code-fold below each package name to see the answer. +::: + +:::{.callout-note} +Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. +::: + +Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. + +
+ +--- + +:::{.callout-tip title="1/20"} +R package: purrr +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://purrr.tidyverse.org/ + +install.packages("purrr") +``` + +
+ +--- + +:::{.callout-tip title="2/20"} +R package: flowCore +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html + +install("flowCore") +``` + +
+ +--- + +:::{.callout-tip title="3/20"} +R package: flowWorkspace +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html + +install("flowWorkspace") +``` + +
+ +--- + +:::{.callout-tip title="4/20"} +R package: stringr +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://stringr.tidyverse.org/ + +install.packages("stringr") +``` + +
+ +--- + +:::{.callout-tip title="5/20"} +R package: ggplot2 +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://ggplot2.tidyverse.org/ + +install.packages("ggplot2") +``` + +
+ +--- + + +:::{.callout-tip title="6/20"} +R package: ggcyto +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html + +install("ggcyto") +``` + +
+ +--- + +:::{.callout-tip title="7/20"} +R package: tidyr +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://tidyr.tidyverse.org/ + +install.packages("tidyr") +``` + +
+ +--- + +:::{.callout-tip title="8/20"} +R package: openCyto +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html + +install("openCyto") +``` + +
+ +--- + +:::{.callout-tip title="9/20"} +R package: FlowSOM +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html + +install("FlowSOM") +``` + +
+ +--- + +:::{.callout-tip title="10/20"} +R package: xml2 +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://xml2.r-lib.org/ + +install.packages("xml2") +``` + +
+ +--- + + +:::{.callout-tip title="11/20"} +R package: saeyslab/CytoNorm +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: GitHub +# Website: https://github.com/saeyslab/CytoNorm + +install_github("saeyslab/CytoNorm") +``` + +
+ +--- + +:::{.callout-tip title="12/20"} +R package: lubridate +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://lubridate.tidyverse.org/ + +install.packages("lubridate") +``` + +
+ +--- + +:::{.callout-tip title="13/20"} +R package: httr2 +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://httr2.r-lib.org/ + +install.packages("httr2") +``` + +
+ +--- + +:::{.callout-tip title="14/20"} +R package: flowGate +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html + +install("flowGate") +``` + +
+ +--- + +:::{.callout-tip title="15/20"} +R package: devtools +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://devtools.r-lib.org/ + +install.packages("devtools") +``` + +
+ +--- + +:::{.callout-tip title="16/20"} +R package: plotly +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://plotly.com/r/getting-started/ + +install.packages("plotly") +``` + +
+ +--- + +:::{.callout-tip title="17/20"} +R package: biosurf/cyCombine +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: GitHub +# Website: https://github.com/biosurf/cyCombine + +install_github("biosurf/cyCombine") +``` + +
+ +--- + +:::{.callout-tip title="18/20"} +R package: CytoML +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html + +install("CytoML") +``` + +
+ +--- + +:::{.callout-tip title="19/20"} +R package: Rtsne +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://github.com/jkrijthe/Rtsne + +install.packages("Rtsne") +``` + +
+ +--- + +:::{.callout-tip title="20/20"} +R package: uwot +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website:https://jlmelville.github.io/uwot/ + +install.packages("uwot") +``` + +
+ +--- + +**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. + +![](images/Entertained.jpg) + +Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). + +
+ +--- + +# Wrap-Up + +In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. + +You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN](https://cran.r-project.org/) repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor](https://www.bioconductor.org/) repository. + +If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. + +Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. + +Until then, Best Wishes! + +- David + +
+ +![](/course/01_InstallingRPackages/images/ExitImage.png) + +--- + +# Additional Resources + +[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An useful beginner-friendly blogpost covering additional aspects from a different perspective. + +[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. + +[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. + +
+ +--- + + +# Take-home Problems + +Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. + +You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. + +:::{.callout-tip title="Problem 1"} +We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains +::: + +:::{.callout-tip title="Problem 2"} +Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. +::: + +:::{.callout-tip title="Problem 3"} +There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. + +After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". + +Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. +::: + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + diff --git a/course/01_InstallingRPackages/slides.qmd b/course/01_InstallingRPackages/slides.qmd index ea8166e..da42fab 100644 --- a/course/01_InstallingRPackages/slides.qmd +++ b/course/01_InstallingRPackages/slides.qmd @@ -1,2080 +1,2080 @@ ---- -title: "01 - Installing R Packages" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {.callout-tip title="."} - -Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. - -::: - ---- - -::: {.fragment} -::: {.callout-important} - -Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/) and [Workstation Setup](/course/00_WorkstationSetup/) walk-throughs, since we will begin where they left off once the required software was successfully installed. - -::: -::: - -::: {.fragment} -::: {.callout-important} - -Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. - -::: -::: - ---- - -# Background - -::: {.fragment} -::: {.callout-tip title="."} - -During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. - -::: -::: - ---- - -:::{.callout-tip} - -R packages can also just be made for fun! Among my favorite examples of this, there is an R package that lets you add the snake game to your [recalculating screen](https://github.com/AdamSpannbauer/snakeLoadR), as well as R packages that provide the color-palette schemes needed to make your plots with [Studio Ghibli](https://github.com/ewenme/ghibli), [Wes Anderson](https://github.com/karthik/wesanderson), or [Bluey](https://github.com/ekholme/blueycolors) colors. - -::: - -::: {.fragment} - -![](images/Ghibli.png){fig-width=100} -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -These R packages start off as [source code](https://r-pkgs.org/structure.html#sec-package-states) (which is what we will be learning to write during this course). When you install a R package to your computer, this human-readable source code gets converted into a binary format with which your computer can interact directly. - -::: -::: - - -::: {.fragment} -::: {.callout-tip title="."} - -Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To make distributing the thousands of R packages and their associated package dependencies easier, R packages are collected (ie. hosted) within **repositories**, which function as an intermediate distributor. - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. - -::: -::: - ---- - - - -::: {.fragment} -::: {.callout-tip title="."} - -The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). - -::: -::: - - -::: {.fragment} -::: {.callout-tip title="."} - -In this session, we will work on installing the various R packages we will need through the course. While doing so, we will explore how to figure out which repository the individual package is in; what installation commands to use to download it; and how to look up the help documentation. We will also touch on how the functions within an R package are made available for our computer to use (via the `library()` call), and how to troubleshoot the more commonly encountered installation errors. - -::: -::: - ---- - -# Getting Started - -## Set Up - -Alright, with the background out of the way, let's get started! - -::: {.fragment} -:::{.callout-important} - -Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. - -::: -::: - -::: {.fragment} -:::{.callout-warning} - -Please remember to always copy over the new material from your local CytometryInR folder to a separate Project Folder that you created and named (ex. "Week_01" or "MyLearningFolder", etc.). This will ensure any edits you make to the files do not affect your ability to bring in next week's materials to the CytometryInR folder - -::: -::: - ---- - -::: {.fragment} -:::{.callout-warning} - -After pulling the new data and code locally, open CytometryInR, open the course folder, and open the 01_InstallingRPackages folder. From here, copy the **index.qmd** file to your own working Project Folder (ex. Week_01) where you can work on it without causing any conflicts. Then return to Positron and open up your working project folder (ex. Week_01). - -::: -::: - ---- - -![](images/01_Interpreter.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Next up, within [Positron](/course/00_Positron/index.qmd#interpreter), let's make sure to select R as the coding language being used for this session. - -::: -::: - ---- - -![](images/01_Interpreter.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Now that R is running within Positron, the console (lower portion of the screenn) is now able to run (ie. execute) any R code that is sent to it. - -::: -::: - ---- - -![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) - -## Checking for Loaded Packages - -::: {.fragment} -::: {.callout-tip title="."} - -For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. - -::: -::: - ---- - -### Accessing Help Documentation - -::: {.fragment} -::: {.callout-tip title="."} - -Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function - -::: -::: - - -::: {.fragment} - -```{r} -#| eval: FALSE -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. - -::: -::: - ---- - -![](images/02_HelpHover.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -In this case, we can see the help documentation corresponding for `sessionInfo()`. Beyond hovering over the function, this can also be accessed by adding a ? directly in front of the function, and then running that line of code. - -::: -::: - - -::: {.fragment} - -```{r} -#| eval: FALSE -?sessionInfo() -``` - -::: - ---- - -![](images/03_QuestionMark.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When executed, the function's help file documentation will open up within the Help tab in the secondary side bar on the right-side of the screen. Glancing at the top of the page we can see the name of the package that contains the `sessionInfo()` function (`{utils}`). Scrolling down the help page past all the documentation, we can see a link to the index page. - -::: -::: - ---- - -![](images/04_Index.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -After clicking, the Help tab switches from viewing the documentation for the `sessionInfo()` function, to showing all the functions within the `utils` package. Most R packages contain help documentation, so this process can be adapted to find out additional information about what a function does, and what arguments are needed to produce customized outputs. - -::: -::: - ---- - -![](images/05_UtilsFunctions.png) - ---- - -### sessionInfo() - -::: {.fragment} -::: {.callout-tip title="."} - -Within your .qmd file, let's go ahead and run the following code-block: - -::: -::: - - -::: {.fragment} - -```{r} -#| echo: TRUE -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. - -For today, let's focus on the last two elements of the output: - -::: -::: - ---- - -![](images/06_sessionInfo.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. - -As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. - -::: -::: - ---- - -## Installing from CRAN - -::: {.fragment} -::: {.callout-tip title="."} - -We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. - -These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. - -::: -::: - ---- - -### dplyr - -::: {.fragment} -::: {.callout-tip title="."} - -Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?install.packages() -``` - -::: - ---- - -![](images/07_InstallPackages.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - -::: - ---- - -:::{.callout-tip} - -A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. - -::: - - -::: {.fragment} - -```{r} -#| error: TRUE - -install.packages(dplyr) -``` - -::: - ---- - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} - -Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). - -::: -::: - ---- - -![](images/08_InstallScript.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. - -If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. - -::: -::: - ---- - -![](images/09_InstallScript2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). - -::: -::: - ---- - -### Attaching packages via library() - -::: {.fragment} -::: {.callout-tip title="."} - -If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?library() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. - -::: -::: - -::: {.fragment} - -```{r} -library(dplyr) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. - -With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. - -::: -::: - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?select -``` - -::: - ---- - -![](images/10_Attached.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. - -By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. - -::: -::: - ---- - -::: {.fragment} - -```{r} -?ggplot -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Beyond individual functions, some R packages also have help landing pages, that can be similarly accessed by adding a ? in front of the package name: - -::: -::: - ---- - -![](images/11_PackageLanding.png) - ---- - -### Unattaching - -::: {.fragment} -::: {.callout-tip title="."} - -So far, we have installed an R package, and then attached it (via `library()`). How would we reverse these steps? - -Well, to unload it from the local environment, there are a couple options. You could of course simply shut down Positron. The local environment only exist in context of when you open and close the session, which closing the program will do. All previously loaded R packages will be unattached, which is why when you start a new session you will need to load in all packages you plan on using via `library()`. - -Alternatively, although less used, you could `detach()` it via your console: - -::: -::: - -::: {.fragment} - -```{r} -detach("package:dplyr", unload=TRUE) -``` - -::: - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Looking at the `sessionInfo()` output, dplyr is no longer attached to the local environment. Consequently, if we try to once again look for the documentation, no information will be retrieved. - -::: -::: - -::: {.fragment} - -```{r} -?dplyr -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -There is a workaround however, if we want to access functions from an unloaded R package. We can specify the R package's name, followed by two :, and then the function name. The :: conveys the context to your computer that the package is present, but may not be attached. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?dplyr::select() -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} - -This particular use case can be useful if we want to run a particular function, but not load in all a packages functions (which may have identical function names to other R packages we are using and cause some conflicts). - -::: -::: - ---- - -### Removing Packages - -::: {.fragment} -::: {.callout-tip title="."} - -Just as we can install an R package, we can also uninstall an R package (although doing so is rare, most often when encountering package dependency conflict). To do so, we would use the `remove.packages()` function. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?remove.packages() -``` - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -remove.packages("dplyr") -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} - -This results in the package being removed entirely from our computer. We would then need to reinstall it if needed in the future. - -::: -::: - ---- - -### Common Issues - -::: {.fragment} -::: {.callout-tip title="."} - -As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? - -To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). - -::: -::: - -::: {.fragment} - -```{r} -install.packages("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. - -This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. - -::: -::: - ---- - -## Installing from Bioconductor - -::: {.fragment} -::: {.callout-tip title="."} - -**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. - -Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("BiocManager") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Once BiocManager is installed, we can attach it to our local environment using the `library()` function - -::: -::: - -::: {.fragment} - -```{r} -library(BiocManager) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When loaded, you will see an output showing the current Bioconductor and R versions. - -We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. - -::: -::: - -:::{.callout-tip} - -As always, don't forget the "" when running an `install()` command. - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?install() -``` - -::: - -::: {.fragment} - -```{r} -install("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. - -::: -::: - -::: {.fragment} -:::{.callout-note} - -Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process - -::: -::: - ---- - -![](images/12_PeacoQCDependencies.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. - -::: -::: - ---- - -![](images/13_rjson.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -This process continues for each dependency being installed. - -::: -::: - ---- - -![](images/13b_Other.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And finally, once all the dependencies are installed, `PeacoQC` starts to install. - -::: -::: - ---- - -![](images/13c_PeacoQC.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. - -::: -::: - ---- - -![](images/14_UpdateAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. - -::: -::: - ---- - -![](images/16_GitHubInstall.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. - -::: -::: - ---- - -![](images/14_UpdateAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -With PeacoQC has been installed, we can load it via the `library()` call - -::: -::: - -:::{.callout-tip} - -Remeber, `library()` doesn't require " " - -::: - -::: {.fragment} - -```{r} -library(PeacoQC) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And we can check to see if it has been attached to the local environment - -::: -::: - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. - -::: -::: - ---- - -![](images/15_AdditionalDependencies.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -installed.packages() -``` - -::: - ---- - -## Install from GitHub - -::: {.fragment} -::: {.callout-tip title="."} - -In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #1"} - -To install a package from CRAN, what function would you use? -Click on the code-fold arrow below to reveal the answer. - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -install.packages("remotes") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -With the `remotes` package now installed, we can attach it to our local environment. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #2"} - -What function would be used to do so? - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -library(remotes) -``` - -::: - - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #3"} - -How would you look up the help documentation for this function? - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Either by hovering over it within Positron or via - -?install_github() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. - -::: -::: - ---- - -![](images/PE_Spectrum.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -install_github("hally166/flowSpectrum") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. - -This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). - -::: -::: - ---- - -![](images/17_InstallSource.png) - ---- - -## Troubleshooting Install Errors - -::: {.fragment} -::: {.callout-tip title="."} - -We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. - -When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. - -::: -::: - ---- - -![](images/18_ErrorExample.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. - -::: -::: - ---- - -## Installing Specific-Package Versions - -::: {.fragment} - -::: {.callout-tip title="."} -While we may be tempted to think of R packages as static, they change quite often, as their develipers add new features, fix bugs, etc. To help keep track of these changes (essential for [reproducibility](https://www.nature.com/articles/d42473-019-00004-y) and replicability), R packages have version numbers. - -When we run `sessionInfo()`, we can see an example of this, with the version number appearing after the package name. - -::: -::: - - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Alternatively, we can retrieve the same information for the individual packages via the `packageVersion()` function - -::: -::: - -::: {.fragment} - -```{r} -packageVersion("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -As well as from the `citation()` function. - -::: -::: - -::: {.fragment} - -```{r} -citation("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -How does a version number work? Lets say we have the following version number: **1.20.0** - -The first number of the version (**1.** in this case) denotes major changes, primarily those where after the version change the package may not be compatible with the code used in the prior version. As a consequence, this number changes rarely. - -The second number (**.20.** in this case) is the minor version. Minor changes typically consist of new features that are added, that don't affect the overall package function. These will change more frequently, especially for Bioconductor packages with fixed [release cycles](https://www.bioconductor.org/developers/release-schedule/). - -The final number (**.0** in this case) is often used to denote small changes occuring within a minor release period, often bug-fixes or fixing typos within the documentation. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We may in the future need to install specific package versions (but wont be doing so today). As expected, which repository contains the R package influences how we would go about doing this. - -For CRAN packages, we can use the `remotes` packages `install_version()` function. This allows us to provide the version number, and designate the repository location (the CRAN url in this case). - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -remotes::install_version("ggplot2", version = "3.5.2", repos = "https://cloud.r-project.org") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -For GitHub-based R packages, the package versioning schema is not as strict as that of CRAN or Bioconductor. Typically, changes in R packagaes are put out by their developers as [releases](https://github.com/DavidRach/Luciernaga/releases). When trying to install a particular release, we can add an additional argument to the `install_github()` function, specifying the release version's tag number. For example: - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -remotes::install_github("DavidRach/Luciernaga", ref = "v0.99.7") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Alternatively, if the developer doesn't implement releases, you can provide the hash number of a particular commit. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -remotes::install_github("DavidRach/Luciernaga", ref = "8d1d694") -``` - -::: - - -## Documentation and Websites - -::: {.fragment} -::: {.callout-tip title="."} - -We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. - -For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr` - -::: -::: - ---- - -![](images/19_DplyrGoogle.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. - -::: -::: - ---- - -![](images/20_DplyrCRAN.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) - -::: -::: - ---- - -![](images/21_DplyrPkgdown.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. - -::: -::: - ---- - -![](images/22_PkgdownArticles.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. - -::: -::: - ---- - -![](images/23_GitHub.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): - -::: -::: - ---- - -![](images/24_PeacoQCBioc.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. - -::: -::: - ---- - -![](images/25_Vignettes.png) - ---- - - -# Your Turn - -::: {.fragment} -::: {.callout-tip title="."} - -Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. - -::: -::: - -:::{.callout-note} - -To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. - -::: - -:::{.callout-important} - -Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. - -::: - -:::{.callout-tip} - -Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. - -For cases where you are truly stuck, expand the code-fold below each package name to see the answer. - -::: - -:::{.callout-note} - -Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. - -::: -::: - ---- - -:::{.callout-tip title="1/20"} - -R package: purrr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://purrr.tidyverse.org/ - -install.packages("purrr") -``` - -::: - ---- - -:::{.callout-tip title="2/20"} - -R package: flowCore - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html - -install("flowCore") -``` - -::: - ---- - -:::{.callout-tip title="3/20"} - -R package: flowWorkspace - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html - -install("flowWorkspace") -``` - -::: - ---- - -:::{.callout-tip title="4/20"} - -R package: stringr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://stringr.tidyverse.org/ - -install.packages("stringr") -``` - -::: - ---- - -:::{.callout-tip title="5/20"} - -R package: ggplot2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://ggplot2.tidyverse.org/ - -install.packages("ggplot2") -``` - -::: - ---- - - -:::{.callout-tip title="6/20"} - -R package: ggcyto - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html - -install("ggcyto") -``` - -::: - ---- - -:::{.callout-tip title="7/20"} - -R package: tidyr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://tidyr.tidyverse.org/ - -install.packages("tidyr") -``` - -::: - ---- - -:::{.callout-tip title="8/20"} - -R package: openCyto - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html - -install("openCyto") -``` - -::: - ---- - -:::{.callout-tip title="9/20"} - -R package: FlowSOM - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html - -install("FlowSOM") -``` - -::: - ---- - -:::{.callout-tip title="10/20"} - -R package: xml2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://xml2.r-lib.org/ - -install.packages("xml2") -``` - -::: - ---- - - -:::{.callout-tip title="11/20"} - -R package: saeyslab/CytoNorm - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: GitHub -# Website: https://github.com/saeyslab/CytoNorm - -install_github("saeyslab/CytoNorm") -``` - -::: - ---- - -:::{.callout-tip title="12/20"} - -R package: lubridate - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://lubridate.tidyverse.org/ - -install.packages("lubridate") -``` - -::: - ---- - -:::{.callout-tip title="13/20"} - -R package: httr2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://httr2.r-lib.org/ - -install.packages("httr2") -``` - -::: - ---- - -:::{.callout-tip title="14/20"} - -R package: flowGate - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html - -install("flowGate") -``` - -::: - ---- - -:::{.callout-tip title="15/20"} - -R package: devtools - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://devtools.r-lib.org/ - -install.packages("devtools") -``` - -::: - ---- - -:::{.callout-tip title="16/20"} - -R package: plotly - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://plotly.com/r/getting-started/ - -install.packages("plotly") -``` - -::: - ---- - -:::{.callout-tip title="17/20"} - -R package: biosurf/cyCombine - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: GitHub -# Website: https://github.com/biosurf/cyCombine - -install_github("biosurf/cyCombine") -``` - -::: - ---- - -:::{.callout-tip title="18/20"} - -R package: CytoML - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html - -install("CytoML") -``` - -::: - ---- - -:::{.callout-tip title="19/20"} - -R package: Rtsne - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://github.com/jkrijthe/Rtsne - -install.packages("Rtsne") -``` - -::: - ---- - -:::{.callout-tip title="20/20"} - -R package: uwot - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website:https://jlmelville.github.io/uwot/ - -install.packages("uwot") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. - -::: -::: - ---- - -![](images/Entertained.jpg) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). - -::: -::: - ---- - -# Wrap-Up - -::: {.fragment} -::: {.callout-tip title="."} - -In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. - -You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN] repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor] repository. - -If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. - -Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. - -Until then, Best Wishes! - -- David - -::: -::: - ---- - -![](/course/01_InstallingRPackages/images/ExitImage.png) - ---- - -# Additional Resources - -::: {.fragment} -::: {.callout-tip title="."} - -[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An usefu beginner-friendly blogpost covering additional aspects from a different perspective. - -[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. - -[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. - -::: -::: - ---- - - -# Take-home Problems - -::: {.fragment} -::: {.callout-tip title="."} - -Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. - -You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. - -::: -::: - ---- - -:::{.callout-tip title="Problem 1"} - -We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains - -::: - ---- - -:::{.callout-tip title="Problem 2"} - -Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. - -::: - ---- - -:::{.callout-tip title="Problem 3"} - -There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. - -After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". - -Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. - -::: - ---- - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - +--- +title: "01 - Installing R Packages" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {.callout-tip title="."} + +Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. + +::: + +--- + +::: {.fragment} +::: {.callout-important} + +Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/) and [Workstation Setup](/course/00_WorkstationSetup/) walk-throughs, since we will begin where they left off once the required software was successfully installed. + +::: +::: + +::: {.fragment} +::: {.callout-important} + +Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. + +::: +::: + +--- + +# Background + +::: {.fragment} +::: {.callout-tip title="."} + +During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. + +::: +::: + +--- + +:::{.callout-tip} + +R packages can also just be made for fun! Among my favorite examples of this, there is an R package that lets you add the snake game to your [recalculating screen](https://github.com/AdamSpannbauer/snakeLoadR), as well as R packages that provide the color-palette schemes needed to make your plots with [Studio Ghibli](https://github.com/ewenme/ghibli), [Wes Anderson](https://github.com/karthik/wesanderson), or [Bluey](https://github.com/ekholme/blueycolors) colors. + +::: + +::: {.fragment} + +![](images/Ghibli.png){fig-width=100} +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +These R packages start off as [source code](https://r-pkgs.org/structure.html#sec-package-states) (which is what we will be learning to write during this course). When you install a R package to your computer, this human-readable source code gets converted into a binary format with which your computer can interact directly. + +::: +::: + + +::: {.fragment} +::: {.callout-tip title="."} + +Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To make distributing the thousands of R packages and their associated package dependencies easier, R packages are collected (ie. hosted) within **repositories**, which function as an intermediate distributor. + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. + +::: +::: + +--- + + + +::: {.fragment} +::: {.callout-tip title="."} + +The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). + +::: +::: + + +::: {.fragment} +::: {.callout-tip title="."} + +In this session, we will work on installing the various R packages we will need through the course. While doing so, we will explore how to figure out which repository the individual package is in; what installation commands to use to download it; and how to look up the help documentation. We will also touch on how the functions within an R package are made available for our computer to use (via the `library()` call), and how to troubleshoot the more commonly encountered installation errors. + +::: +::: + +--- + +# Getting Started + +## Set Up + +Alright, with the background out of the way, let's get started! + +::: {.fragment} +:::{.callout-important} + +Please make sure to [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR repository, and [pull](/course/00_Git/index.qmd#pull) any changes to your local computer's CytometryInR project folder so that you have the most recent version of the code and data available. + +::: +::: + +::: {.fragment} +:::{.callout-warning} + +Please remember to always copy over the new material from your local CytometryInR folder to a separate Project Folder that you created and named (ex. "Week_01" or "MyLearningFolder", etc.). This will ensure any edits you make to the files do not affect your ability to bring in next week's materials to the CytometryInR folder + +::: +::: + +--- + +::: {.fragment} +:::{.callout-warning} + +After pulling the new data and code locally, open CytometryInR, open the course folder, and open the 01_InstallingRPackages folder. From here, copy the **index.qmd** file to your own working Project Folder (ex. Week_01) where you can work on it without causing any conflicts. Then return to Positron and open up your working project folder (ex. Week_01). + +::: +::: + +--- + +![](images/01_Interpreter.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Next up, within [Positron](/course/00_Positron/index.qmd#interpreter), let's make sure to select R as the coding language being used for this session. + +::: +::: + +--- + +![](images/01_Interpreter.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Now that R is running within Positron, the console (lower portion of the screenn) is now able to run (ie. execute) any R code that is sent to it. + +::: +::: + +--- + +![](https://positron.posit.co/images/user-interface-for-rstudio-migration.jpeg) + +## Checking for Loaded Packages + +::: {.fragment} +::: {.callout-tip title="."} + +For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. + +::: +::: + +--- + +### Accessing Help Documentation + +::: {.fragment} +::: {.callout-tip title="."} + +Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function + +::: +::: + + +::: {.fragment} + +```{r} +#| eval: FALSE +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. + +::: +::: + +--- + +![](images/02_HelpHover.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +In this case, we can see the help documentation corresponding for `sessionInfo()`. Beyond hovering over the function, this can also be accessed by adding a ? directly in front of the function, and then running that line of code. + +::: +::: + + +::: {.fragment} + +```{r} +#| eval: FALSE +?sessionInfo() +``` + +::: + +--- + +![](images/03_QuestionMark.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When executed, the function's help file documentation will open up within the Help tab in the secondary side bar on the right-side of the screen. Glancing at the top of the page we can see the name of the package that contains the `sessionInfo()` function (`{utils}`). Scrolling down the help page past all the documentation, we can see a link to the index page. + +::: +::: + +--- + +![](images/04_Index.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +After clicking, the Help tab switches from viewing the documentation for the `sessionInfo()` function, to showing all the functions within the `utils` package. Most R packages contain help documentation, so this process can be adapted to find out additional information about what a function does, and what arguments are needed to produce customized outputs. + +::: +::: + +--- + +![](images/05_UtilsFunctions.png) + +--- + +### sessionInfo() + +::: {.fragment} +::: {.callout-tip title="."} + +Within your .qmd file, let's go ahead and run the following code-block: + +::: +::: + + +::: {.fragment} + +```{r} +#| echo: TRUE +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. + +For today, let's focus on the last two elements of the output: + +::: +::: + +--- + +![](images/06_sessionInfo.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. + +As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. + +::: +::: + +--- + +## Installing from CRAN + +::: {.fragment} +::: {.callout-tip title="."} + +We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. + +These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. + +::: +::: + +--- + +### dplyr + +::: {.fragment} +::: {.callout-tip title="."} + +Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?install.packages() +``` + +::: + +--- + +![](images/07_InstallPackages.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + +::: + +--- + +:::{.callout-tip} + +A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. + +::: + + +::: {.fragment} + +```{r} +#| error: TRUE + +install.packages(dplyr) +``` + +::: + +--- + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} + +Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). + +::: +::: + +--- + +![](images/08_InstallScript.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. + +If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. + +::: +::: + +--- + +![](images/09_InstallScript2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). + +::: +::: + +--- + +### Attaching packages via library() + +::: {.fragment} +::: {.callout-tip title="."} + +If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?library() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. + +::: +::: + +::: {.fragment} + +```{r} +library(dplyr) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. + +With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. + +::: +::: + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?select +``` + +::: + +--- + +![](images/10_Attached.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. + +By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. + +::: +::: + +--- + +::: {.fragment} + +```{r} +?ggplot +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Beyond individual functions, some R packages also have help landing pages, that can be similarly accessed by adding a ? in front of the package name: + +::: +::: + +--- + +![](images/11_PackageLanding.png) + +--- + +### Unattaching + +::: {.fragment} +::: {.callout-tip title="."} + +So far, we have installed an R package, and then attached it (via `library()`). How would we reverse these steps? + +Well, to unload it from the local environment, there are a couple options. You could of course simply shut down Positron. The local environment only exist in context of when you open and close the session, which closing the program will do. All previously loaded R packages will be unattached, which is why when you start a new session you will need to load in all packages you plan on using via `library()`. + +Alternatively, although less used, you could `detach()` it via your console: + +::: +::: + +::: {.fragment} + +```{r} +detach("package:dplyr", unload=TRUE) +``` + +::: + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Looking at the `sessionInfo()` output, dplyr is no longer attached to the local environment. Consequently, if we try to once again look for the documentation, no information will be retrieved. + +::: +::: + +::: {.fragment} + +```{r} +?dplyr +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +There is a workaround however, if we want to access functions from an unloaded R package. We can specify the R package's name, followed by two :, and then the function name. The :: conveys the context to your computer that the package is present, but may not be attached. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?dplyr::select() +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} + +This particular use case can be useful if we want to run a particular function, but not load in all a packages functions (which may have identical function names to other R packages we are using and cause some conflicts). + +::: +::: + +--- + +### Removing Packages + +::: {.fragment} +::: {.callout-tip title="."} + +Just as we can install an R package, we can also uninstall an R package (although doing so is rare, most often when encountering package dependency conflict). To do so, we would use the `remove.packages()` function. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?remove.packages() +``` + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +remove.packages("dplyr") +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} + +This results in the package being removed entirely from our computer. We would then need to reinstall it if needed in the future. + +::: +::: + +--- + +### Common Issues + +::: {.fragment} +::: {.callout-tip title="."} + +As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? + +To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). + +::: +::: + +::: {.fragment} + +```{r} +install.packages("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. + +This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. + +::: +::: + +--- + +## Installing from Bioconductor + +::: {.fragment} +::: {.callout-tip title="."} + +**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. + +Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("BiocManager") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Once BiocManager is installed, we can attach it to our local environment using the `library()` function + +::: +::: + +::: {.fragment} + +```{r} +library(BiocManager) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When loaded, you will see an output showing the current Bioconductor and R versions. + +We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. + +::: +::: + +:::{.callout-tip} + +As always, don't forget the "" when running an `install()` command. + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?install() +``` + +::: + +::: {.fragment} + +```{r} +install("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. + +::: +::: + +::: {.fragment} +:::{.callout-note} + +Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process + +::: +::: + +--- + +![](images/12_PeacoQCDependencies.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. + +::: +::: + +--- + +![](images/13_rjson.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +This process continues for each dependency being installed. + +::: +::: + +--- + +![](images/13b_Other.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And finally, once all the dependencies are installed, `PeacoQC` starts to install. + +::: +::: + +--- + +![](images/13c_PeacoQC.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. + +::: +::: + +--- + +![](images/14_UpdateAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. + +::: +::: + +--- + +![](images/16_GitHubInstall.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. + +::: +::: + +--- + +![](images/14_UpdateAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +With PeacoQC has been installed, we can load it via the `library()` call + +::: +::: + +:::{.callout-tip} + +Remeber, `library()` doesn't require " " + +::: + +::: {.fragment} + +```{r} +library(PeacoQC) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And we can check to see if it has been attached to the local environment + +::: +::: + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. + +::: +::: + +--- + +![](images/15_AdditionalDependencies.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +installed.packages() +``` + +::: + +--- + +## Install from GitHub + +::: {.fragment} +::: {.callout-tip title="."} + +In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #1"} + +To install a package from CRAN, what function would you use? +Click on the code-fold arrow below to reveal the answer. + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +install.packages("remotes") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +With the `remotes` package now installed, we can attach it to our local environment. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #2"} + +What function would be used to do so? + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +library(remotes) +``` + +::: + + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #3"} + +How would you look up the help documentation for this function? + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Either by hovering over it within Positron or via + +?install_github() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. + +::: +::: + +--- + +![](images/PE_Spectrum.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +install_github("hally166/flowSpectrum") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. + +This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). + +::: +::: + +--- + +![](images/17_InstallSource.png) + +--- + +## Troubleshooting Install Errors + +::: {.fragment} +::: {.callout-tip title="."} + +We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. + +When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. + +::: +::: + +--- + +![](images/18_ErrorExample.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. + +::: +::: + +--- + +## Installing Specific-Package Versions + +::: {.fragment} + +::: {.callout-tip title="."} +While we may be tempted to think of R packages as static, they change quite often, as their develipers add new features, fix bugs, etc. To help keep track of these changes (essential for [reproducibility](https://www.nature.com/articles/d42473-019-00004-y) and replicability), R packages have version numbers. + +When we run `sessionInfo()`, we can see an example of this, with the version number appearing after the package name. + +::: +::: + + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Alternatively, we can retrieve the same information for the individual packages via the `packageVersion()` function + +::: +::: + +::: {.fragment} + +```{r} +packageVersion("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +As well as from the `citation()` function. + +::: +::: + +::: {.fragment} + +```{r} +citation("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +How does a version number work? Lets say we have the following version number: **1.20.0** + +The first number of the version (**1.** in this case) denotes major changes, primarily those where after the version change the package may not be compatible with the code used in the prior version. As a consequence, this number changes rarely. + +The second number (**.20.** in this case) is the minor version. Minor changes typically consist of new features that are added, that don't affect the overall package function. These will change more frequently, especially for Bioconductor packages with fixed [release cycles](https://www.bioconductor.org/developers/release-schedule/). + +The final number (**.0** in this case) is often used to denote small changes occuring within a minor release period, often bug-fixes or fixing typos within the documentation. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We may in the future need to install specific package versions (but wont be doing so today). As expected, which repository contains the R package influences how we would go about doing this. + +For CRAN packages, we can use the `remotes` packages `install_version()` function. This allows us to provide the version number, and designate the repository location (the CRAN url in this case). + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +remotes::install_version("ggplot2", version = "3.5.2", repos = "https://cloud.r-project.org") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +For GitHub-based R packages, the package versioning schema is not as strict as that of CRAN or Bioconductor. Typically, changes in R packagaes are put out by their developers as [releases](https://github.com/DavidRach/Luciernaga/releases). When trying to install a particular release, we can add an additional argument to the `install_github()` function, specifying the release version's tag number. For example: + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +remotes::install_github("DavidRach/Luciernaga", ref = "v0.99.7") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Alternatively, if the developer doesn't implement releases, you can provide the hash number of a particular commit. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +remotes::install_github("DavidRach/Luciernaga", ref = "8d1d694") +``` + +::: + + +## Documentation and Websites + +::: {.fragment} +::: {.callout-tip title="."} + +We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. + +For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr` + +::: +::: + +--- + +![](images/19_DplyrGoogle.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. + +::: +::: + +--- + +![](images/20_DplyrCRAN.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) + +::: +::: + +--- + +![](images/21_DplyrPkgdown.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. + +::: +::: + +--- + +![](images/22_PkgdownArticles.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. + +::: +::: + +--- + +![](images/23_GitHub.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): + +::: +::: + +--- + +![](images/24_PeacoQCBioc.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. + +::: +::: + +--- + +![](images/25_Vignettes.png) + +--- + + +# Your Turn + +::: {.fragment} +::: {.callout-tip title="."} + +Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. + +::: +::: + +:::{.callout-note} + +To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. + +::: + +:::{.callout-important} + +Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. + +::: + +:::{.callout-tip} + +Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. + +For cases where you are truly stuck, expand the code-fold below each package name to see the answer. + +::: + +:::{.callout-note} + +Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. + +::: +::: + +--- + +:::{.callout-tip title="1/20"} + +R package: purrr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://purrr.tidyverse.org/ + +install.packages("purrr") +``` + +::: + +--- + +:::{.callout-tip title="2/20"} + +R package: flowCore + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html + +install("flowCore") +``` + +::: + +--- + +:::{.callout-tip title="3/20"} + +R package: flowWorkspace + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html + +install("flowWorkspace") +``` + +::: + +--- + +:::{.callout-tip title="4/20"} + +R package: stringr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://stringr.tidyverse.org/ + +install.packages("stringr") +``` + +::: + +--- + +:::{.callout-tip title="5/20"} + +R package: ggplot2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://ggplot2.tidyverse.org/ + +install.packages("ggplot2") +``` + +::: + +--- + + +:::{.callout-tip title="6/20"} + +R package: ggcyto + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html + +install("ggcyto") +``` + +::: + +--- + +:::{.callout-tip title="7/20"} + +R package: tidyr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://tidyr.tidyverse.org/ + +install.packages("tidyr") +``` + +::: + +--- + +:::{.callout-tip title="8/20"} + +R package: openCyto + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html + +install("openCyto") +``` + +::: + +--- + +:::{.callout-tip title="9/20"} + +R package: FlowSOM + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html + +install("FlowSOM") +``` + +::: + +--- + +:::{.callout-tip title="10/20"} + +R package: xml2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://xml2.r-lib.org/ + +install.packages("xml2") +``` + +::: + +--- + + +:::{.callout-tip title="11/20"} + +R package: saeyslab/CytoNorm + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: GitHub +# Website: https://github.com/saeyslab/CytoNorm + +install_github("saeyslab/CytoNorm") +``` + +::: + +--- + +:::{.callout-tip title="12/20"} + +R package: lubridate + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://lubridate.tidyverse.org/ + +install.packages("lubridate") +``` + +::: + +--- + +:::{.callout-tip title="13/20"} + +R package: httr2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://httr2.r-lib.org/ + +install.packages("httr2") +``` + +::: + +--- + +:::{.callout-tip title="14/20"} + +R package: flowGate + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html + +install("flowGate") +``` + +::: + +--- + +:::{.callout-tip title="15/20"} + +R package: devtools + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://devtools.r-lib.org/ + +install.packages("devtools") +``` + +::: + +--- + +:::{.callout-tip title="16/20"} + +R package: plotly + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://plotly.com/r/getting-started/ + +install.packages("plotly") +``` + +::: + +--- + +:::{.callout-tip title="17/20"} + +R package: biosurf/cyCombine + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: GitHub +# Website: https://github.com/biosurf/cyCombine + +install_github("biosurf/cyCombine") +``` + +::: + +--- + +:::{.callout-tip title="18/20"} + +R package: CytoML + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html + +install("CytoML") +``` + +::: + +--- + +:::{.callout-tip title="19/20"} + +R package: Rtsne + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://github.com/jkrijthe/Rtsne + +install.packages("Rtsne") +``` + +::: + +--- + +:::{.callout-tip title="20/20"} + +R package: uwot + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website:https://jlmelville.github.io/uwot/ + +install.packages("uwot") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. + +::: +::: + +--- + +![](images/Entertained.jpg) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). + +::: +::: + +--- + +# Wrap-Up + +::: {.fragment} +::: {.callout-tip title="."} + +In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. + +You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN] repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor] repository. + +If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. + +Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. + +Until then, Best Wishes! + +- David + +::: +::: + +--- + +![](/course/01_InstallingRPackages/images/ExitImage.png) + +--- + +# Additional Resources + +::: {.fragment} +::: {.callout-tip title="."} + +[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An usefu beginner-friendly blogpost covering additional aspects from a different perspective. + +[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. + +[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. + +::: +::: + +--- + + +# Take-home Problems + +::: {.fragment} +::: {.callout-tip title="."} + +Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. + +You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. + +::: +::: + +--- + +:::{.callout-tip title="Problem 1"} + +We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains + +::: + +--- + +:::{.callout-tip title="Problem 2"} + +Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. + +::: + +--- + +:::{.callout-tip title="Problem 3"} + +There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. + +After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". + +Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. + +::: + +--- + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + diff --git a/course/01_InstallingRPackages/slides_inperson.qmd b/course/01_InstallingRPackages/slides_inperson.qmd index 078e802..3cc1f08 100644 --- a/course/01_InstallingRPackages/slides_inperson.qmd +++ b/course/01_InstallingRPackages/slides_inperson.qmd @@ -1,1661 +1,1661 @@ ---- -title: "01 - Installing R Packages" -author: "David Rach" -date: 02-01-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {.callout-tip title="."} - -Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. - -::: - -# Background - -::: {.fragment} -::: {.callout-tip title="."} - -During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). - -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} - -Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. - -::: -::: - ---- - - -::: {.fragment} -::: {.callout-tip title="."} - -Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. - -::: -::: - ---- - - - -::: {.fragment} -::: {.callout-tip title="."} - -The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). - -::: -::: - ---- - -# Getting Started - -## Checking for Loaded Packages - -::: {.fragment} -::: {.callout-tip title="."} - -For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. - -::: -::: - ---- - -### Accessing Help Documentation - -::: {.fragment} -::: {.callout-tip title="."} - -Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function - -::: -::: - - -::: {.fragment} - -```{r} -#| eval: FALSE -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. - -::: -::: - ---- - -![](images/02_HelpHover.png) - ---- - -::: {.fragment} - -```{r} -#| eval: FALSE -?sessionInfo() -``` - -::: - ---- - -![](images/03_QuestionMark.png) - ---- - -### sessionInfo() - -::: {.fragment} -::: {.callout-tip title="."} - -Within your .qmd file, let's go ahead and run the following code-block: - -::: -::: - - -::: {.fragment} - -```{r} -#| echo: TRUE -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. - -For today, let's focus on the last two elements of the output: - -::: -::: - ---- - -![](images/06_sessionInfo.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. - -As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. - -::: -::: - ---- - -## Installing from CRAN - -::: {.fragment} -::: {.callout-tip title="."} - -We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. - -These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. - -::: -::: - ---- - -### dplyr - -::: {.fragment} -::: {.callout-tip title="."} - -Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?install.packages() -``` - -::: - ---- - -![](images/07_InstallPackages.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - -::: - ---- - -:::{.callout-tip} - -A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. - -::: - - -::: {.fragment} - -```{r} -#| error: TRUE - -install.packages(dplyr) -``` - -::: - ---- - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("dplyr") -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} - -Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). - -::: -::: - ---- - -![](images/08_InstallScript.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. - -If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. - -::: -::: - ---- - -![](images/09_InstallScript2.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). - -::: -::: - ---- - -### Attaching packages via library() - -::: {.fragment} -::: {.callout-tip title="."} - -If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?library() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. - -::: -::: - -::: {.fragment} - -```{r} -library(dplyr) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. - -With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. - -::: -::: - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?select -``` - -::: - ---- - -![](images/10_Attached.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. - -By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. - -::: -::: - ---- - -::: {.fragment} - -```{r} -?ggplot -``` - -::: - ---- - -### Common Issues - -::: {.fragment} -::: {.callout-tip title="."} - -As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? - -To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). - -::: -::: - -::: {.fragment} - -```{r} -install.packages("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. - -This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. - -::: -::: - ---- - -## Installing from Bioconductor - -::: {.fragment} -::: {.callout-tip title="."} - -**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. - -Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -install.packages("BiocManager") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Once BiocManager is installed, we can attach it to our local environment using the `library()` function - -::: -::: - -::: {.fragment} - -```{r} -library(BiocManager) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When loaded, you will see an output showing the current Bioconductor and R versions. - -We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. - -::: -::: - -:::{.callout-tip} - -As always, don't forget the "" when running an `install()` command. - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?install() -``` - -::: - -::: {.fragment} - -```{r} -install("PeacoQC") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. - -::: -::: - -::: {.fragment} -:::{.callout-note} - -Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process - -::: -::: - ---- - -![](images/12_PeacoQCDependencies.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. - -::: -::: - ---- - -![](images/13_rjson.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -This process continues for each dependency being installed. - -::: -::: - ---- - -![](images/13b_Other.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And finally, once all the dependencies are installed, `PeacoQC` starts to install. - -::: -::: - ---- - -![](images/13c_PeacoQC.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. - -::: -::: - ---- - -![](images/14_UpdateAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. - -::: -::: - ---- - -![](images/16_GitHubInstall.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. - -::: -::: - ---- - -![](images/14_UpdateAll.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -With PeacoQC has been installed, we can load it via the `library()` call - -::: -::: - -:::{.callout-tip} - -Remeber, `library()` doesn't require " " - -::: - -::: {.fragment} - -```{r} -library(PeacoQC) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And we can check to see if it has been attached to the local environment - -::: -::: - -::: {.fragment} - -```{r} -sessionInfo() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. - -::: -::: - ---- - -![](images/15_AdditionalDependencies.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -installed.packages() -``` - -::: - ---- - -## Install from GitHub - -::: {.fragment} -::: {.callout-tip title="."} - -In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). - -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #1"} - -To install a package from CRAN, what function would you use? -Click on the code-fold arrow below to reveal the answer. - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -install.packages("remotes") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -With the `remotes` package now installed, we can attach it to our local environment. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #2"} - -What function would be used to do so? - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -library(remotes) -``` - -::: - - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. - -::: -::: - -::: {.fragment} -:::{.callout-tip title="Spot Check #3"} - -How would you look up the help documentation for this function? - -::: -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Either by hovering over it within Positron or via - -?install_github() -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. - -::: -::: - ---- - -![](images/PE_Spectrum.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -install_github("hally166/flowSpectrum") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. - -This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). - -::: -::: - ---- - -![](images/17_InstallSource.png) - ---- - -## Troubleshooting Install Errors - -::: {.fragment} -::: {.callout-tip title="."} - -We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. - -When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. - -::: -::: - ---- - -![](images/18_ErrorExample.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. - -::: -::: - ---- - - -## Documentation and Websites - -::: {.fragment} -::: {.callout-tip title="."} - -We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. - -For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr` - -::: -::: - ---- - -![](images/19_DplyrGoogle.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. - -::: -::: - ---- - -![](images/20_DplyrCRAN.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) - -::: -::: - ---- - -![](images/21_DplyrPkgdown.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. - -::: -::: - ---- - -![](images/22_PkgdownArticles.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. - -::: -::: - ---- - -![](images/23_GitHub.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): - -::: -::: - ---- - -![](images/24_PeacoQCBioc.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. - -::: -::: - ---- - -![](images/25_Vignettes.png) - ---- - - -# Your Turn - -::: {.fragment} -::: {.callout-tip title="."} - -Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. - -::: -::: - -:::{.callout-note} - -To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. - -::: - -:::{.callout-important} - -Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. - -::: - -:::{.callout-tip} - -Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. - -For cases where you are truly stuck, expand the code-fold below each package name to see the answer. - -::: - -:::{.callout-note} - -Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. - -::: -::: - ---- - -:::{.callout-tip title="1/20"} - -R package: purrr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://purrr.tidyverse.org/ - -install.packages("purrr") -``` - -::: - ---- - -:::{.callout-tip title="2/20"} - -R package: flowCore - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html - -install("flowCore") -``` - -::: - ---- - -:::{.callout-tip title="3/20"} - -R package: flowWorkspace - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html - -install("flowWorkspace") -``` - -::: - ---- - -:::{.callout-tip title="4/20"} - -R package: stringr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://stringr.tidyverse.org/ - -install.packages("stringr") -``` - -::: - ---- - -:::{.callout-tip title="5/20"} - -R package: ggplot2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://ggplot2.tidyverse.org/ - -install.packages("ggplot2") -``` - -::: - ---- - - -:::{.callout-tip title="6/20"} - -R package: ggcyto - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html - -install.packages("ggcyto") -``` - -::: - ---- - -:::{.callout-tip title="7/20"} - -R package: tidyr - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://tidyr.tidyverse.org/ - -install.packages("tidyr") -``` - -::: - ---- - -:::{.callout-tip title="8/20"} - -R package: openCyto - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html - -install.packages("openCyto") -``` - -::: - ---- - -:::{.callout-tip title="9/20"} - -R package: FlowSOM - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html - -install.packages("FlowSOM") -``` - -::: - ---- - -:::{.callout-tip title="10/20"} - -R package: xml2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: CRAN -# Website: https://xml2.r-lib.org/ - -install.packages("xml2") -``` - -::: - ---- - - -:::{.callout-tip title="11/20"} - -R package: saeyslab/CytoNorm - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - - -# Location: GitHub -# Website: https://github.com/saeyslab/CytoNorm - -install_github("saeyslab/CytoNorm") -``` - -::: - ---- - -:::{.callout-tip title="12/20"} - -R package: lubridate - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://lubridate.tidyverse.org/ - -install.packages("lubridate") -``` - -::: - ---- - -:::{.callout-tip title="13/20"} - -R package: httr2 - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://httr2.r-lib.org/ - -install.packages("httr2") -``` - -::: - ---- - -:::{.callout-tip title="14/20"} - -R package: flowGate - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html - -install("flowGate") -``` - -::: - ---- - -:::{.callout-tip title="15/20"} - -R package: devtools - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://devtools.r-lib.org/ - -install.packages("devtools") -``` - -::: - ---- - -:::{.callout-tip title="16/20"} - -R package: plotly - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://plotly.com/r/getting-started/ - -install.packages("plotly") -``` - -::: - ---- - -:::{.callout-tip title="17/20"} - -R package: biosurf/cyCombine - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: GitHub -# Website: https://github.com/biosurf/cyCombine - -install_github("biosurf/cyCombine") -``` - -::: - ---- - -:::{.callout-tip title="18/20"} - -R package: CytoML - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: Bioconductor -# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html - -install("CytoML") -``` - -::: - ---- - -:::{.callout-tip title="19/20"} - -R package: Rtsne - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website: https://github.com/jkrijthe/Rtsne - -install.packages("Rtsne") -``` - -::: - ---- - -:::{.callout-tip title="20/20"} - -R package: uwot - -::: - -::: {.fragment} - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Location: CRAN -# Website:https://jlmelville.github.io/uwot/ - -install.packages("uwot") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. - -::: -::: - ---- - -![](images/Entertained.jpg) - ---- - -::: {.fragment} -::: {.callout-tip title="."} - -Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). - -::: -::: - ---- - -# Wrap-Up - -::: {.fragment} -::: {.callout-tip title="."} - -In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. - -You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN] repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor] repository. - -If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. - -Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. - -Until then, Best Wishes! - -- David - -::: -::: - ---- - -![](/course/01_InstallingRPackages/images/ExitImage.png) - ---- - -# Additional Resources - -::: {.fragment} -::: {.callout-tip title="."} - -[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An usefu beginner-friendly blogpost covering additional aspects from a different perspective. - -[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. - -[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. - -::: -::: - ---- - - -# Take-home Problems - -::: {.fragment} -::: {.callout-tip title="."} - -Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. - -You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. - -::: -::: - ---- - -:::{.callout-tip title="Problem 1"} - -We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains - -::: - ---- - -:::{.callout-tip title="Problem 2"} - -Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. - -::: - ---- - -:::{.callout-tip title="Problem 3"} - -There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. - -After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". - -Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. - -::: - ---- - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - +--- +title: "01 - Installing R Packages" +author: "David Rach" +date: 02-01-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {.callout-tip title="."} + +Welcome to the first week of [Cytometry in R](/Schedule.qmd)! This week we will be diving into how R packages work, and the how to go about installing them. + +::: + +# Background + +::: {.fragment} +::: {.callout-tip title="."} + +During [Workstation Setup](/course/00_WorkstationSetup/), you installed the R software to your local computer. R as a [programming language](https://en.wikipedia.org/wiki/R_(programming_language)) that started up in the 1990s. While its original focus was on statistics, it is now widely used in various fields thanks to contributions of many open-source developers over the years. + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +This expanded reach is in part due to the ability to create [**R packages**](https://en.wikipedia.org/wiki/R_package), that encapsulate additional [**functions**](https://adv-r.hadley.nz/functions.html#function-fundamentals), that can do new things beyond what the original software (ie. **base R**) was capable of doing. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Currently, there are [thousands](https://cran.r-project.org/web/packages/available_packages_by_name.html) of R packages available. Furthermore, there is a vibrant [community](https://www.reddit.com/r/rstats/) of individuals that help maintain and document how to use these packages, which has helped sustain and grow the R ecosystem over the last couple [decades](https://youtu.be/gjpNEVcG1nU?si=rcEBSc7AnAsgsAy2). + +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} + +Regardless if you are working with [flow cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry), or in [ecology](https://drmattg.github.io/REcol-verse/), or in [econometrics](https://www.econometrics-with-r.org/1-introduction.html), or [political science](https://github.com/fivethirtyeight/data), a lot of the analysis and visualizations that you see in publications often involve R. + +::: +::: + +--- + + +::: {.fragment} +::: {.callout-tip title="."} + +Expanding on this concept, a new R package can be made up of new code (primarily in the form of tools (ie. **functions**) that do a particular useful things) that is entirely self-contained, or reuse functions present in existing R packages to help make something new. When an R package relies on a function from another R package, it needs the other R package to be installed in order for everything to work properly. This is known as a package **dependency**. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The three main locations for R packages from are **[CRAN](https://cran.r-project.org/)** (containing 23069 packages), **[Bioconductor](https://www.bioconductor.org/)** (containing 2361 packages), and individual R packages hosted by their developers via **[GitHub](https://github.com/trending/r)**. + +::: +::: + +--- + + + +::: {.fragment} +::: {.callout-tip title="."} + +The process of installing R packages will vary a bit depending on which repository the respective R package is in. For beginners, this often prooves to be a pain-point, as they will attempt to install an R package using one set of installation commands, only to get an error (because the R package is not in that repository). + +::: +::: + +--- + +# Getting Started + +## Checking for Loaded Packages + +::: {.fragment} +::: {.callout-tip title="."} + +For the contents (ie. the functions) of an R package to be available for your computer to use, they must first be activated (ie. loaded) into your local environment. We will first learn how to check what R packages are currently active. + +::: +::: + +--- + +### Accessing Help Documentation + +::: {.fragment} +::: {.callout-tip title="."} + +Within your own index.qmd (or a new .qmd file that you created), type out/copy-paste the following `sessionInfo()` function + +::: +::: + + +::: {.fragment} + +```{r} +#| eval: FALSE +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +If you hover over the line of code within Positron, you will glimpse the help file for the particular function you are hovering over. + +::: +::: + +--- + +![](images/02_HelpHover.png) + +--- + +::: {.fragment} + +```{r} +#| eval: FALSE +?sessionInfo() +``` + +::: + +--- + +![](images/03_QuestionMark.png) + +--- + +### sessionInfo() + +::: {.fragment} +::: {.callout-tip title="."} + +Within your .qmd file, let's go ahead and run the following code-block: + +::: +::: + + +::: {.fragment} + +```{r} +#| echo: TRUE +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The outputs that get returned by `sessionInfo()` will vary a bit depending on your computer's [operating system](/course/00_WorkstationSetup/), and the version of R you have installed. + +For today, let's focus on the last two elements of the output: + +::: +::: + +--- + +![](images/06_sessionInfo.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The [R software](https://www.r-project.org/) itself is made up of several **base R packages**, that are loaded automatically. These contain everything you need to read, write and run R code on your computer. You can see these packages are the stats, graphics, grDevices, utils, datasets, methods and base packages. + +As we install additional R packages and load them using the `library()` function throughout this session, sporadically re-run `sessionInfo()` to see how this list of R packages changes. + +::: +::: + +--- + +## Installing from CRAN + +::: {.fragment} +::: {.callout-tip title="."} + +We will start by installing R packages that are part of the [CRAN](https://cran.r-project.org/) repository. This is the main R package repository, being part of the broader R software project. In the context of this course, R packages that work primarily with general data structure (rows, columns, matrices, etc.) or visualizations will predominantly be found within this repository. + +These include the [tidyverse](https://tidyverse.org/) packages. These packages have collectively made R easier to use by smoothing out some of the rough edges of base R, which is why R has seen major growth within the last decade. We will be installing several of these R packages today. + +::: +::: + +--- + +### dplyr + +::: {.fragment} +::: {.callout-tip title="."} + +Our first R package we will install during this session is the [dplyr](https://dplyr.tidyverse.org/) package. Since it is hosted on the CRAN repository, to install it, we will need to use the CRAN-specific installation function `install.packages()`. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?install.packages() +``` + +::: + +--- + +![](images/07_InstallPackages.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +For the `install.packages()` function, we place within the () the name of the R package from CRAN that we wish to install. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + +::: + +--- + +:::{.callout-tip} + +A usual struggle point for beginners is that install.packages() requires " " to be placed around the package name. Forgetting them results in the error that we see below. + +::: + + +::: {.fragment} + +```{r} +#| error: TRUE + +install.packages(dplyr) +``` + +::: + +--- + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("dplyr") +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} + +Go ahead and click on "Run Cell" next to your code-block, to install the `dplyr` R package. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When a package starts to install, you will see your console start to display text resembling that seen in the image below (varying a bit depending on your computers operating system). + +::: +::: + +--- + +![](images/08_InstallScript.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Within this opening scrawl, you will see the location on your computer the R package is being installed to, as well as the file location for the R package being retrieved on CRAN. + +If the package is successfully located, your computer will proceed to first download, then unpack (ie. unzip) it, before attempting to install to the target folder. + +::: +::: + +--- + +![](images/09_InstallScript2.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +The final steps of the installation process involved various steps to verify everything was copied successfully, the help documentation assembled, and that the R package is capable of being loaded. If this is the case, you will see the "Done" line appear, as well as a mention where the original downloaded source package files has been stashed (usually a temp folder). + +::: +::: + +--- + +### Attaching packages via library() + +::: {.fragment} +::: {.callout-tip title="."} + +If an R package has been installed successfully, we are now able to load it (ie. make it's functions available) to our local environment using the `library()` function. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?library() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Unlike `install.packages()`, where we needed "" around the package name, the `library()` function does not require "" around the package name. Let's go ahead and load in `dplyr`, making its respective functions to our local environment. + +::: +::: + +::: {.fragment} + +```{r} +library(dplyr) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +From the output, we can see that `dplyr` has been attached. There are also a couple functions within dplyr that have identical names to functions within the stats and base packages. To avoid confusion, these 6 functions are masked, which is why we get the additional messages. + +With `dplyr` now loaded via the `library()` call, let's check `sessionInfo()` to see what has changed. + +::: +::: + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Similar to what was seen for the base R packages, `dplyr` is now attached. This means we should theoretically now have access to all its functions. We can verify this by seeing if we can look up the `dplyr` packages `select()` function and it's respective help page. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?select +``` + +::: + +--- + +![](images/10_Attached.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Since its parent package has been attached to our local environment (via the `library()` call), we can see `dplyr` functions appear as suggestions as we begin to type. + +By contrast, is we check for the `ggplot()` function from the ggplot2 package (which we haven't yet installed or attached via `library()`), no suggestions will pop up. + +::: +::: + +--- + +::: {.fragment} + +```{r} +?ggplot +``` + +::: + +--- + +### Common Issues + +::: {.fragment} +::: {.callout-tip title="."} + +As previously mentioned, [CRAN](https://cran.r-project.org/) is the main repository for R packages. But what if we tried to install an R package that is only found on [Bioconductor](https://www.bioconductor.org/) or via [GitHub](https://github.com/trending/r) using the `install.packages()` function? + +To see what occurs, let's try installing the `PeacoQC` [package](https://www.bioconductor.org/packages/release/bioc/html/PeacoQC.html) (which is found on Bioconductor). + +::: +::: + +::: {.fragment} + +```{r} +install.packages("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +As you can see, the initial warning message suggest that `PeacoQC` is not available for your version of R. When I first started trying to learn R on my own during COVID, this particular message was the bane of my existence and I couldn't figure out what was going on. + +This is just a default warning message, that would apply for both a package having a version mismatch, but also shown when trying to install packages that are not found on CRAN. + +::: +::: + +--- + +## Installing from Bioconductor + +::: {.fragment} +::: {.callout-tip title="."} + +**[Bioconductor](https://www.bioconductor.org/)** is the second R package repository we will be working with throughout the course. While it contains far fewer packages than CRAN, it contains packages that are primarily used by the biomedical sciences. Following this [link](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) you can find it's current flow and mass cytometry R packages. + +Bioconductor R packages differ from CRAN R packages in a couple of ways. Bioconductor has different [standards](https://contributions.bioconductor.org/) for acceptance than [CRAN](https://r-pkgs.org/release.html). They usually contain interoperable object-types, put more effort into documentation and continous testing to ensure that the R package remains functional across operating systems. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install an R package that is located on [Bioconductor](https://www.bioconductor.org/), we first need to install the `BiocManager` package from CRAN. This package will allow us to install Bioconductor packages from their respective repository. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +install.packages("BiocManager") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Once BiocManager is installed, we can attach it to our local environment using the `library()` function + +::: +::: + +::: {.fragment} + +```{r} +library(BiocManager) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When loaded, you will see an output showing the current Bioconductor and R versions. + +We can then use BiocManager's `install()` function to go back and install `PeacoQC()`. + +::: +::: + +:::{.callout-tip} + +As always, don't forget the "" when running an `install()` command. + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?install() +``` + +::: + +::: {.fragment} + +```{r} +install("PeacoQC") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We see a similar opening sequence of installation steps as what we saw when installing the `dplyr` package from CRAN. However, in this case, several package dependencies (rjson, GlobalOptions, etc.) are present. Consequently, you can see these packages are also being downloaded from their respective repositories (either CRAN or Bioconductor), then unzipped and assembled before PeacoQC undergoes installation. + +::: +::: + +::: {.fragment} +:::{.callout-note} + +Behind the scenes, within an R package, what package dependencies need to be installed are specified through the Description and Namespace files. If a package name is removed from these files, it will not be installed during the installation process + +::: +::: + +--- + +![](images/12_PeacoQCDependencies.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Within the scrawl of installation outputs, we can see individual dependencies undergoing installation similar to what we saw with `dplyr`, with a "Done (packagename)" being printed upon successful installation. + +::: +::: + +--- + +![](images/13_rjson.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +This process continues for each dependency being installed. + +::: +::: + +--- + +![](images/13b_Other.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And finally, once all the dependencies are installed, `PeacoQC` starts to install. + +::: +::: + +--- + +![](images/13c_PeacoQC.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Occasionally, during installation, you will see a pop-up windown like this one in the console. This let's you know that some of the package dependencies have newer updated versions that are available to download. We are prompted to select between updating all, some or none. You will need to specify via the console how you want to proceed, by typing and entering one of the suggested options [a/s/n]. + +::: +::: + +--- + +![](images/14_UpdateAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Alternatively you may encounter a pop-up that resembles this one. Unlike the a/s/n output, we would need to provide a number for our intended choice. In this case, I went ahead and skipped all updates by typing 3 into the console, then hitting enter. + +::: +::: + +--- + +![](images/16_GitHubInstall.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Generally, it's okay to update if you have the time. Updates generally consist of minor improvements or bug fixes, that shouldn't cause major issues. If you are short on time, you can go ahead and select skip the update by entering the value (n) for the none option. + +::: +::: + +--- + +![](images/14_UpdateAll.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +With PeacoQC has been installed, we can load it via the `library()` call + +::: +::: + +:::{.callout-tip} + +Remeber, `library()` doesn't require " " + +::: + +::: {.fragment} + +```{r} +library(PeacoQC) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And we can check to see if it has been attached to the local environment + +::: +::: + +::: {.fragment} + +```{r} +sessionInfo() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +As you may have noticed, the section of ***loaded via namespace (but not attached)*** packages has grown larger. These packages are dependencies for the attached packages (dplyr, BiocManager and PeacoQC). Since the functions within these dependencies are only used selectively by the attached packages, they do not need to be active within the local environment. + +::: +::: + +--- + +![](images/15_AdditionalDependencies.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To see what packages are installed (but not yet loaded), we can use the `installed.packages()` function to return a list of R packages for your computer. + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +installed.packages() +``` + +::: + +--- + +## Install from GitHub + +::: {.fragment} +::: {.callout-tip title="."} + +In addition to the [CRAN](https://cran.r-project.org/) and [Bioconductor](https://www.bioconductor.org/) repositories, individual R packages can also be found on [GitHub](https://github.com/trending/r) hosted on their respective developers GitHub accounts. Newer packages that are still being worked on (often in the process of submission to [CRAN](https://r-pkgs.org/release.html) or [Bioconductor]((https://contributions.bioconductor.org/))) can be found here, as well as those where the author decided not to bother with a review process, and just made the packages immediately available, warts and all. + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +While many gems of R packages can be found on GitHub, there are also a bunch of R packages that due to [deprecation](https://devguide.ropensci.org/maintenance_evolution.html) since when they were published and released have stopped working. This is often the case for R packages that are not maintained, which is why it's useful to check the [commits](https://github.com/carlosproca/autospill/commits/master/) and [issues](https://github.com/carlosproca/autospill/issues) pages to see when the last contribution occurred. We will take a closer look at how to do so [later on](/Schedule.qmd#the-art-of-github-diving). + +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install packages from GitHub, you will need the `remotes` package, which can be found on CRAN. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #1"} + +To install a package from CRAN, what function would you use? +Click on the code-fold arrow below to reveal the answer. + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +install.packages("remotes") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +With the `remotes` package now installed, we can attach it to our local environment. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #2"} + +What function would be used to do so? + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +library(remotes) +``` + +::: + + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +And finally, we can use the `install_github()` function to download R packages from the invidual developers GitHub account. + +::: +::: + +::: {.fragment} +:::{.callout-tip title="Spot Check #3"} + +How would you look up the help documentation for this function? + +::: +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Either by hovering over it within Positron or via + +?install_github() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We will be installing a small R package [flowSpectrum](https://github.com/hally166/flowSpectrum) for this example. It's one of the packages created by [Christopher Hall](https://github.com/hally166), whose small series of [Flow Cytometry Data Analysis in R](https://youtu.be/2INqQNMNaV0?si=dZ_rJ1S26KnNbUmU) tutorials were immensely useful when I was first getting started learning R. `flowSpectrum` can be used to generate spectrum-style plots for spectral flow cytometry data. + +::: +::: + +--- + +![](images/PE_Spectrum.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +To install an R package from GitHub, we first need the GitHub username (so [hally166](https://github.com/hally166) in this case), which is followed by a "/", and then the name of the package repository (so [flowSpectrum](https://github.com/hally166/flowSpectrum) in this case). Our code should consequently be + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +install_github("hally166/flowSpectrum") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +When installing from GitHub, the opening installation scrawl will look different. Unlike R packages from CRAN or Bioconductor, which are usually shipped in an assembled binary format, R packages from GitHub start off as source code. So the first steps shown in the scrawl are the process of converting them to binary before proceeding. + +This process of building R packages from source code is one of the reasons we needed to install Rtools (for Windows users) or Xcode Developer Tools (for MacOS) for this course. We will look at this topic in greater depth later in the course when we talk about creating [R packages](/Schedule.qmd#building-your-first-r-package). + +::: +::: + +--- + +![](images/17_InstallSource.png) + +--- + +## Troubleshooting Install Errors + +::: {.fragment} +::: {.callout-tip title="."} + +We have now installed three R packages, `dplyr`, `PeacoQC`, and `flowSpectrum`. In my case, I did not encounter any errors during the installation. However, sometimes a package installation will fail due to an error encountered during the installation process. This can be due to a number of reasons, ranging from a missing dependency, or an update that caused a conflict. While these can occur for CRAN or Bioconductor packages, they are more frequently seen for GitHub packages where the Description/Namespace files may not have been fully updated yet to install all the required dependencies. + +When encountering an error, start of by first reading through the message to see if you can parse any useful information about what package failed to install, and if it list the missing dependency packages name. The later was the case in the error message example shown below. + +::: +::: + +--- + +![](images/18_ErrorExample.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +If you encounter an installation error this week, please take screenshots of the error message and post them to this [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). This will help us troubleshoot your installation, as well as provide additional examples of installation errors that will be used to update this section in the future. + +::: +::: + +--- + + +## Documentation and Websites + +::: {.fragment} +::: {.callout-tip title="."} + +We have already seen a couple ways to access the help documentation contained within an R package via Positron. Beyond internal documentation, R packages often have external websites that contain additional walk-through articles (ie. vignettes) to better document how to use the package. + +For CRAN-based packages, we can start off by searching for the package name. So, in the case of `dplyr` + +::: +::: + +--- + +![](images/19_DplyrGoogle.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Two main suggestions pop up. One is the package's [CRAN](https://cran.r-project.org/web/packages/dplyr/index.html) page. Unfortunately, this one is not particularly user-friendly, although some text-based vignettes are accessible. + +::: +::: + +--- + +![](images/20_DplyrCRAN.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Because of this, many CRAN-based R packages (especially those part of the tidyverse) use [pkgdown](https://pkgdown.r-lib.org/)-generated websites hosted via a GitHub page (similar to the one used by this course. The second option on the search is dplyr's pkgdown-style [website](https://dplyr.tidyverse.org/) + +::: +::: + +--- + +![](images/21_DplyrPkgdown.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +We can usually find the list of functions under the Reference tab, with the more extensive documentation vignettes being found under the Articles tab. + +::: +::: + +--- + +![](images/22_PkgdownArticles.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +GitHub-based packages will vary depending on their individual developers, but often will also use pkgdown-style websites. These often appear as links on the right-hand side, or within the repository's ReadMe. + +::: +::: + +--- + +![](images/23_GitHub.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +For Bioconductor-based packages, on the package's page we can typically find the already rendered vignette articles, usually as either html or pdf files. For example, with [PeacoQC](https://www.bioconductor.org/packages/release/bioc/vignettes/PeacoQC/inst/doc/PeacoQC_Vignette.pdf): + +::: +::: + +--- + +![](images/24_PeacoQCBioc.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Additionally, package vignettes can also be reached via the packages help index page. These will usually appear under ***User guides, package vignettes, and other documentation***. + +::: +::: + +--- + +![](images/25_Vignettes.png) + +--- + + +# Your Turn + +::: {.fragment} +::: {.callout-tip title="."} + +Alright, we have now gone through the process of installing an R package from [CRAN](/course/01_InstallingRPackages/index.qmd#installing-from-cran), [Bioconductor](/course/01_InstallingRPackages/index.qmd#installing-from-bioconductor), and [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github). We will now install 20 other R packages we will need throughout the rest of the course. + +::: +::: + +:::{.callout-note} + +To make this interactive, [**I will task you**]{.underscore} to apply the previous concepts to figure out whether the packages need to be installed via CRAN, Bioconductor or GitHub. + +::: + +:::{.callout-important} + +Feel free to view the [website](https://umgcccfcsr.github.io/CytometryInR/course/) version to avoid accidental spoilers from the copied over index.qmd file. Alternatively, you can attempt to switch from the Source view to Visual Mode by right clicking with your mouse and selecting that option. + +::: + +:::{.callout-tip} + +Start by searching each packages name. See if you can spot first either a CRAN or a Bioconductor website. Then enter the respective installation command (`install.packages()`, `install()`, `install_github()`) for the appropiate repository, add the package name, and run the code to see if the installation proceeds. + +For cases where you are truly stuck, expand the code-fold below each package name to see the answer. + +::: + +:::{.callout-note} + +Some of these packages may be dependencies of each other and may wind up installed before you get to them. If that is the case, no need to reinstall, count it as a win, and proceed to the next R package. + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Remember,if you encountered any installation errors in the process, please take screenshots and post them on the the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10) to help with improved documentation. + +::: +::: + +--- + +:::{.callout-tip title="1/20"} + +R package: purrr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://purrr.tidyverse.org/ + +install.packages("purrr") +``` + +::: + +--- + +:::{.callout-tip title="2/20"} + +R package: flowCore + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowCore.html + +install("flowCore") +``` + +::: + +--- + +:::{.callout-tip title="3/20"} + +R package: flowWorkspace + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowWorkspace.html + +install("flowWorkspace") +``` + +::: + +--- + +:::{.callout-tip title="4/20"} + +R package: stringr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://stringr.tidyverse.org/ + +install.packages("stringr") +``` + +::: + +--- + +:::{.callout-tip title="5/20"} + +R package: ggplot2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://ggplot2.tidyverse.org/ + +install.packages("ggplot2") +``` + +::: + +--- + + +:::{.callout-tip title="6/20"} + +R package: ggcyto + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html + +install.packages("ggcyto") +``` + +::: + +--- + +:::{.callout-tip title="7/20"} + +R package: tidyr + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://tidyr.tidyverse.org/ + +install.packages("tidyr") +``` + +::: + +--- + +:::{.callout-tip title="8/20"} + +R package: openCyto + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/openCyto.html + +install.packages("openCyto") +``` + +::: + +--- + +:::{.callout-tip title="9/20"} + +R package: FlowSOM + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/FlowSOM.html + +install.packages("FlowSOM") +``` + +::: + +--- + +:::{.callout-tip title="10/20"} + +R package: xml2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: CRAN +# Website: https://xml2.r-lib.org/ + +install.packages("xml2") +``` + +::: + +--- + + +:::{.callout-tip title="11/20"} + +R package: saeyslab/CytoNorm + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + + +# Location: GitHub +# Website: https://github.com/saeyslab/CytoNorm + +install_github("saeyslab/CytoNorm") +``` + +::: + +--- + +:::{.callout-tip title="12/20"} + +R package: lubridate + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://lubridate.tidyverse.org/ + +install.packages("lubridate") +``` + +::: + +--- + +:::{.callout-tip title="13/20"} + +R package: httr2 + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://httr2.r-lib.org/ + +install.packages("httr2") +``` + +::: + +--- + +:::{.callout-tip title="14/20"} + +R package: flowGate + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/flowGate.html + +install("flowGate") +``` + +::: + +--- + +:::{.callout-tip title="15/20"} + +R package: devtools + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://devtools.r-lib.org/ + +install.packages("devtools") +``` + +::: + +--- + +:::{.callout-tip title="16/20"} + +R package: plotly + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://plotly.com/r/getting-started/ + +install.packages("plotly") +``` + +::: + +--- + +:::{.callout-tip title="17/20"} + +R package: biosurf/cyCombine + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: GitHub +# Website: https://github.com/biosurf/cyCombine + +install_github("biosurf/cyCombine") +``` + +::: + +--- + +:::{.callout-tip title="18/20"} + +R package: CytoML + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: Bioconductor +# Website: https://www.bioconductor.org/packages/release/bioc/html/CytoML.html + +install("CytoML") +``` + +::: + +--- + +:::{.callout-tip title="19/20"} + +R package: Rtsne + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website: https://github.com/jkrijthe/Rtsne + +install.packages("Rtsne") +``` + +::: + +--- + +:::{.callout-tip title="20/20"} + +R package: uwot + +::: + +::: {.fragment} + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Location: CRAN +# Website:https://jlmelville.github.io/uwot/ + +install.packages("uwot") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +**Congratulations!** You have (hopefully) survived the package installation onslaught that is Week #1 of the course. + +::: +::: + +--- + +![](images/Entertained.jpg) + +--- + +::: {.fragment} +::: {.callout-tip title="."} + +Remember to submit any encountered installation error screenshots to the [Discussion page](https://github.com/UMGCCCFCSR/CytometryInR/discussions/10). + +::: +::: + +--- + +# Wrap-Up + +::: {.fragment} +::: {.callout-tip title="."} + +In this session, we walked through what are R packages, where to find them, how to install them, and a bit about troubleshooting any installation errors you may encounter during the process. + +You then proceeded to install most of the R packages that you would need throughout the [Cytometry in R course](/Schedule.qmd). These included tidyverse packages from the [CRAN] repository used for working with data structures and plots, as well as more cytometry focused R packages from [Bioconductor] repository. + +If you have any questions, or want to discuss this week's topics in more depth with the other course participants, please head over to the [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) page and open a new topic. + +Next week, we will start learning about [file paths](/Schedule.qmd#file-paths), by which we will be able to tell our computer where to find your fcs files, how to retrieve the file names, subset those that may be of particular interest, and copy them over to a new folder. In the processs, we will learn a little more about how variables, objects, and list work within R. + +Until then, Best Wishes! + +- David + +::: +::: + +--- + +![](/course/01_InstallingRPackages/images/ExitImage.png) + +--- + +# Additional Resources + +::: {.fragment} +::: {.callout-tip title="."} + +[Tidy Tales](https://tidytales.ca/series/2023-01-24_reproducible-data-science/posts/r-packages.html) An usefu beginner-friendly blogpost covering additional aspects from a different perspective. + +[Introduction to Bioconductor](https://youtu.be/dg6NvmMVQ3I?si=WfsqpO3Z-M2oG8zh) A talk by Martin Morgan with more information about the Bioconductor project. + +[R Packages](https://r-pkgs.org/) A book by Hadley Wickham and Jennifer Bryan, covering all the different internals of R packages. + +::: +::: + +--- + + +# Take-home Problems + +::: {.fragment} +::: {.callout-tip title="."} + +Below you will find the optional take-home problems for Week #1. Learning how to code well requires continous practice, and that involves cycles of trying something, failing, and troubleshooting to get it working. The goal of these problems is to help you explore the topic in greater depth than the currated boundaries of this one lecture. + +You are more than welcome to open a [Discussion](https://github.com/UMGCCCFCSR/CytometryInR/discussions) to engage with others in the course to discuss these questions. Once you are done tinkering, and want to get final instructor feedback on your work, place your files within a folder, and follow the instructions to submit it as a [Pull Request](/course/00_Homeworks/index.qmd#submitting-take-home-problems) to the Cytometry In R repositories homework branch. + +::: +::: + +--- + +:::{.callout-tip title="Problem 1"} + +We installed PeacoQC during this session, but we didn't have time to explore what functions are present within the package. Using what you have learned about accessing documentation, figure out and list what functions it contains + +::: + +--- + +:::{.callout-tip title="Problem 2"} + +Take a closer look at the list of Bioconductor [cytometry](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) packages. Report back on how many there are currently in Bioconductor, the author/maintainer with the most contributed cytometry R packages, and a couple packages that you would be interested in exploring more in-depth later in the course. + +::: + +--- + +:::{.callout-tip title="Problem 3"} + +There is another way to install R packages, using the newer [pak](https://pak.r-lib.org/) package. Positron uses this when installing suggested dependencies. + +After learning more about it via the documentation and it's pkgdown website, I would like you to attempt to install the following three R packages using this newer method: "broom", "cytoMEM", "DillonHammill/CytoExploreR". + +Take screenshots, and in a new [quarto markdown document](/course/00_Quarto/index.qmd), describe how the installation process differed from what you saw for `install.packages()`, `install()` and `install_github()`. + +::: + +--- + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + diff --git a/course/02_FilePaths/Downsampler.qmd b/course/02_FilePaths/Downsampler.qmd index d879635..c6647df 100644 --- a/course/02_FilePaths/Downsampler.qmd +++ b/course/02_FilePaths/Downsampler.qmd @@ -1,81 +1,81 @@ ---- -title: "Downsampling" -author: "David Rach" - -format: html ---- - -# Background - -Due to trying to keep the overall file size down, I am downsampling to 100 events. For anyone interested in how I did this, this Quarto Markdown Document contains the code needed to repeat the process. - -# Getting Started - -Attach the required packages via the `library()` function - -```{r} -#| eval: FALSE -library(purrr) # CRAN -library(flowWorkspace) # Bioconductor -library(Luciernaga) #DavidRach/Luciernaga -``` - -## Specify file.path and identify files - -Due to the counts being conducter on two separate instruments, the number of columns differs, so they will need to be loaded into separate GatingSet objects. - -```{r} -#| eval: FALSE -StorageLocation <- file.path("course", "02_FilePaths", "data") -Existing <- list.files(StorageLocation, pattern=".fcs", full.names=TRUE) -List1 <- Existing[1:2] # 3L Aurora -List2 <- Existing[3:8] # 4L Aurora -``` - -## Load .fcs files into a GatingSet - -Load in files to their respective GatingSet objects - -```{r} -#| eval: FALSE -cs1 <- load_cytoset_from_fcs(List1, truncate_max_range = FALSE, transformation = FALSE) -gs1 <- GatingSet(cs1) - -cs2 <- load_cytoset_from_fcs(List2, truncate_max_range = FALSE, transformation = FALSE) -gs2 <- GatingSet(cs2) -``` - -# Downsample each sample and pass back to the folder - -From here, each file in the Gating set is passed to `Utility_Downsample()`, subsampling for 100 events. In this case, subsets argument is set to "root", so all events. If we had implemented gates, we could have selected a particular population from which to downsample. - -```{r} -#| eval: FALSE -walk(.x=gs1, .f=Luciernaga::Utility_Downsample, - sample.name=c("$PROJ", "GROUPNAME", "TUBENAME"), - export=TRUE, outpath=StorageLocation, - subsample=100, subsets="root", inverse.transform=FALSE) - -walk(.x=gs2, .f=Luciernaga::Utility_Downsample, - sample.name=c("$PROJ", "GROUPNAME", "TUBENAME"), - export=TRUE, outpath=StorageLocation, - subsample=100, subsets="root", inverse.transform=FALSE) -``` - -# Conclusion - -In the end, we went from having files that were the following size - -![](images/OG_Size.png) - -To ones that were like this: - -![](images/Downsampled.png) - -We will look more at how the Utility_Downsample is constructed during [Week #10](/Schedule.qmd#downsampling-and-concatenation) - -```{r} -#| eval: FALSE -sessionInfo() -``` - +--- +title: "Downsampling" +author: "David Rach" + +format: html +--- + +# Background + +Due to trying to keep the overall file size down, I am downsampling to 100 events. For anyone interested in how I did this, this Quarto Markdown Document contains the code needed to repeat the process. + +# Getting Started + +Attach the required packages via the `library()` function + +```{r} +#| eval: FALSE +library(purrr) # CRAN +library(flowWorkspace) # Bioconductor +library(Luciernaga) #DavidRach/Luciernaga +``` + +## Specify file.path and identify files + +Due to the counts being conducter on two separate instruments, the number of columns differs, so they will need to be loaded into separate GatingSet objects. + +```{r} +#| eval: FALSE +StorageLocation <- file.path("course", "02_FilePaths", "data") +Existing <- list.files(StorageLocation, pattern=".fcs", full.names=TRUE) +List1 <- Existing[1:2] # 3L Aurora +List2 <- Existing[3:8] # 4L Aurora +``` + +## Load .fcs files into a GatingSet + +Load in files to their respective GatingSet objects + +```{r} +#| eval: FALSE +cs1 <- load_cytoset_from_fcs(List1, truncate_max_range = FALSE, transformation = FALSE) +gs1 <- GatingSet(cs1) + +cs2 <- load_cytoset_from_fcs(List2, truncate_max_range = FALSE, transformation = FALSE) +gs2 <- GatingSet(cs2) +``` + +# Downsample each sample and pass back to the folder + +From here, each file in the Gating set is passed to `Utility_Downsample()`, subsampling for 100 events. In this case, subsets argument is set to "root", so all events. If we had implemented gates, we could have selected a particular population from which to downsample. + +```{r} +#| eval: FALSE +walk(.x=gs1, .f=Luciernaga::Utility_Downsample, + sample.name=c("$PROJ", "GROUPNAME", "TUBENAME"), + export=TRUE, outpath=StorageLocation, + subsample=100, subsets="root", inverse.transform=FALSE) + +walk(.x=gs2, .f=Luciernaga::Utility_Downsample, + sample.name=c("$PROJ", "GROUPNAME", "TUBENAME"), + export=TRUE, outpath=StorageLocation, + subsample=100, subsets="root", inverse.transform=FALSE) +``` + +# Conclusion + +In the end, we went from having files that were the following size + +![](images/OG_Size.png) + +To ones that were like this: + +![](images/Downsampled.png) + +We will look more at how the Utility_Downsample is constructed during [Week #10](/Schedule.qmd#downsampling-and-concatenation) + +```{r} +#| eval: FALSE +sessionInfo() +``` + diff --git a/course/02_FilePaths/homeworks/README.md b/course/02_FilePaths/homeworks/README.md index 2818b5e..fe53443 100644 --- a/course/02_FilePaths/homeworks/README.md +++ b/course/02_FilePaths/homeworks/README.md @@ -1,5 +1,5 @@ -# Turning In Optional Take-Home Problems - -This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. - +# Turning In Optional Take-Home Problems + +This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. + Within your branch, inside this "homeworks" folder, create a new folder (name it with your GitHub username). Then copy all files you will be submitting within your folder. Then commit the change to git, and push to GitHub. See [Getting Help](/course/00_Homeworks/index.qmd)for details on submitting the pull request to the UMGCCCFCSR/CytometryInR homework branch. \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/LICENSE b/course/02_FilePaths/homeworks/claude-chew/LICENSE new file mode 100644 index 0000000..ada1a81 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/course/02_FilePaths/homeworks/claude-chew/Problem1.png b/course/02_FilePaths/homeworks/claude-chew/Problem1.png new file mode 100644 index 0000000..e69de29 diff --git a/course/02_FilePaths/homeworks/claude-chew/README.md b/course/02_FilePaths/homeworks/claude-chew/README.md new file mode 100644 index 0000000..20d6f8e --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/README.md @@ -0,0 +1,2 @@ +# Week2 +Workflow and Version Control Example diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework.html b/course/02_FilePaths/homeworks/claude-chew/Week2Homework.html new file mode 100644 index 0000000..5f9c584 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework.html @@ -0,0 +1,610 @@ + + + + + + + + + +week2homework + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+

Problem 1

+

Plug in an external hard-drive or USB into your computer. Manually, create a folder within called “TargetFolder”. Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D

+
+
FCSTargetFolder <- "F:/TargetFolder"
+FCS <- list.files("C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data", pattern=".fcs$", full.names=TRUE, recursive = FALSE)
+library(stringr)
+str_detect(FCS, "fcs")
+
+
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
+
+
FCS[str_detect(FCS,"fcs")]
+
+
[1] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts3L_AB_02_INF052_00.fcs"     
+[2] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts3L_AB_02_ND050_02.fcs"      
+[3] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_03_INF134_00.fcs"     
+[4] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_03_NY068_03.fcs"      
+[5] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_04_INF124-7_00_01.fcs"
+[6] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_04_ND006_04.fcs"      
+[7] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_05_INF019-0_00_01.fcs"
+[8] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/CellCounts4L_AB_05_ND050_05.fcs"      
+
+
FCSFiles <- FCS[str_detect(FCS, "fcs")]
+file.copy(from=FCSFiles, to="F:/TargetFolder/")
+
+
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
+
+
+
+
+

+
Problem1 screenshot
+
+
+
+
+

Problem 2

+

In this session, we used list.files() with the “full.names argument” set to TRUE, as well as the basename() function to identify specific files. But what if you wanted a particular directory. Run list.files() with “full.names argument” and “recursive” argument set to TRUE, and then search online to find an R function that would retrieve the “” individual directory folders.

+

Clarification from email: Hi @claude-chew and @jttoivon, sorry for the unclear question! What I would be looking for would a function that would be able to isolate lets say either data or Cytometry in R from the following file path:

+

C:/Users/JohnDoe/Documents/CytometryInR/course/02_FilePaths/datra/target3

+
+
list.files(path="data", full.names=TRUE, recursive=TRUE)
+
+
 [1] "data/CellCounts3L_AB_02_INF052_00.fcs"             
+ [2] "data/CellCounts3L_AB_02_ND050_02.fcs"              
+ [3] "data/CellCounts4L_AB_03_INF134_00.fcs"             
+ [4] "data/CellCounts4L_AB_03_NY068_03.fcs"              
+ [5] "data/CellCounts4L_AB_04_INF124-7_00_01.fcs"        
+ [6] "data/CellCounts4L_AB_04_ND006_04.fcs"              
+ [7] "data/CellCounts4L_AB_05_INF019-0_00_01.fcs"        
+ [8] "data/CellCounts4L_AB_05_ND050_05.fcs"              
+ [9] "data/target/CellCounts3L_AB_02_INF052_00.fcs"      
+[10] "data/target/CellCounts3L_AB_02_ND050_02.fcs"       
+[11] "data/target2/CellCounts3L_AB_02_INF052_00.fcs"     
+[12] "data/target2/CellCounts3L_AB_02_ND050_02.fcs"      
+[13] "data/target3/CellCounts3L_AB_02_INF052_00.fcs"     
+[14] "data/target3/CellCounts4L_AB_03_INF134_00.fcs"     
+[15] "data/target3/CellCounts4L_AB_04_INF124-7_00_01.fcs"
+[16] "data/target3/CellCounts4L_AB_05_INF019-0_00_01.fcs"
+
+
path <- "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/target3"
+path1 <- "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/"
+basename(path)
+
+
[1] "target3"
+
+
dirname(path)
+
+
[1] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data"
+
+
basename(path1)
+
+
[1] "Week2"
+
+
dirname(path1)
+
+
[1] "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents"
+
+
+
+
+

+
Problem2 screenshot
+
+
+
+
+

Problem 3

+

R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the system.file() function. See an example below.

+

system.file(“extdata”, package = “FlowSOM”)

+

Using what we have learned about file.path navigation, search your way down the file.directory of the FlowSOM and flowWorkspace packages, and identify any .fcs files that are present for use in the documentation.

+
+
system.file("extdata", package = "FlowSOM")
+
+
[1] "C:/Users/claud/AppData/Local/R/win-library/4.5/FlowSOM/extdata"
+
+
system.file("extdata", package = "flowWorkspace")
+
+
[1] "C:/Users/claud/AppData/Local/R/win-library/4.5/flowWorkspace/extdata"
+
+
list.files(path="C:/Users/claud/AppData/Local/R/win-library/4.5/FlowSOM/extdata", pattern=".fcs", full.names=TRUE, recursive=FALSE)
+
+
[1] "C:/Users/claud/AppData/Local/R/win-library/4.5/FlowSOM/extdata/68983.fcs"
+
+
list.files(path="C:/Users/claud/AppData/Local/R/win-library/4.5/flowWorkspace/extdata", pattern=".fcs", full.names=TRUE, recursive=FALSE)
+
+
character(0)
+
+
+
+
+

+
Problem3 screenshot
+
+
+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework.qmd b/course/02_FilePaths/homeworks/claude-chew/Week2Homework.qmd new file mode 100644 index 0000000..a38316e --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework.qmd @@ -0,0 +1,56 @@ + + +# Problem 1 +Plug in an external hard-drive or USB into your computer. Manually, create a folder within called “TargetFolder”. Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D + +```{r} +FCSTargetFolder <- "F:/TargetFolder" +FCS <- list.files("C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data", pattern=".fcs$", full.names=TRUE, recursive = FALSE) +library(stringr) +str_detect(FCS, "fcs") +FCS[str_detect(FCS,"fcs")] +FCSFiles <- FCS[str_detect(FCS, "fcs")] +file.copy(from=FCSFiles, to="F:/TargetFolder/") +``` + +![Problem1 screenshot](images/Problem1.png) + +# Problem 2 +In this session, we used list.files() with the “full.names argument” set to TRUE, as well as the basename() function to identify specific files. But what if you wanted a particular directory. Run list.files() with “full.names argument” and “recursive” argument set to TRUE, and then search online to find an R function that would retrieve the “” individual directory folders. + +Clarification from email: +Hi @claude-chew and @jttoivon, sorry for the unclear question! What I would be looking for would a function that would be able to isolate lets say either data or Cytometry in R from the following file path: + +C:/Users/JohnDoe/Documents/CytometryInR/course/02_FilePaths/datra/target3 + +```{r} +list.files(path="data", full.names=TRUE, recursive=TRUE) + +path <- "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/data/target3" +path1 <- "C:/Users/claud/OneDrive - Baylor College of Medicine/Documents/Week2/" +basename(path) +dirname(path) +basename(path1) +dirname(path1) + +``` + +![Problem2 screenshot](images/Problem2.png) + +# Problem 3 +R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the system.file() function. See an example below. + +system.file("extdata", package = "FlowSOM") + +Using what we have learned about file.path navigation, search your way down the file.directory of the FlowSOM and flowWorkspace packages, and identify any .fcs files that are present for use in the documentation. + + +```{r} +system.file("extdata", package = "FlowSOM") +system.file("extdata", package = "flowWorkspace") + +list.files(path="C:/Users/claud/AppData/Local/R/win-library/4.5/FlowSOM/extdata", pattern=".fcs", full.names=TRUE, recursive=FALSE) +list.files(path="C:/Users/claud/AppData/Local/R/win-library/4.5/flowWorkspace/extdata", pattern=".fcs", full.names=TRUE, recursive=FALSE) +``` + +![Problem3 screenshot](images/Problem3.png) \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css new file mode 100644 index 0000000..29be797 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: rgb(5.2, 44, 101.2);--bs-secondary-text-emphasis: rgb(43.2, 46.8, 50);--bs-success-text-emphasis: rgb(10, 54, 33.6);--bs-info-text-emphasis: rgb(5.2, 80.8, 96);--bs-warning-text-emphasis: rgb(102, 77.2, 2.8);--bs-danger-text-emphasis: rgb(88, 21.2, 27.6);--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: rgb(206.6, 226, 254.6);--bs-secondary-bg-subtle: rgb(225.6, 227.4, 229);--bs-success-bg-subtle: rgb(209, 231, 220.8);--bs-info-bg-subtle: rgb(206.6, 244.4, 252);--bs-warning-bg-subtle: rgb(255, 242.6, 205.4);--bs-danger-bg-subtle: rgb(248, 214.6, 217.8);--bs-light-bg-subtle: rgb(251.5, 252, 252.5);--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: rgb(158.2, 197, 254.2);--bs-secondary-border-subtle: rgb(196.2, 199.8, 203);--bs-success-border-subtle: rgb(163, 207, 186.6);--bs-info-border-subtle: rgb(158.2, 233.8, 249);--bs-warning-border-subtle: rgb(255, 230.2, 155.8);--bs-danger-border-subtle: rgb(241, 174.2, 180.6);--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: rgb(10.4, 88, 202.4);--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: rgb(255, 242.6, 205.4);--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: rgb(221.7, 222.3, 222.9);--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: rgb(42.5, 47.5, 52.5);--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: rgb(109.8, 168, 253.8);--bs-secondary-text-emphasis: rgb(166.8, 172.2, 177);--bs-success-text-emphasis: rgb(117, 183, 152.4);--bs-info-text-emphasis: rgb(109.8, 223.2, 246);--bs-warning-text-emphasis: rgb(255, 217.8, 106.2);--bs-danger-text-emphasis: rgb(234, 133.8, 143.4);--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: rgb(2.6, 22, 50.6);--bs-secondary-bg-subtle: rgb(21.6, 23.4, 25);--bs-success-bg-subtle: rgb(5, 27, 16.8);--bs-info-bg-subtle: rgb(2.6, 40.4, 48);--bs-warning-bg-subtle: rgb(51, 38.6, 1.4);--bs-danger-bg-subtle: rgb(44, 10.6, 13.8);--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: rgb(7.8, 66, 151.8);--bs-secondary-border-subtle: rgb(64.8, 70.2, 75);--bs-success-border-subtle: rgb(15, 81, 50.4);--bs-info-border-subtle: rgb(7.8, 121.2, 144);--bs-warning-border-subtle: rgb(153, 115.8, 4.2);--bs-danger-border-subtle: rgb(132, 31.8, 41.4);--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: rgb(109.8, 168, 253.8);--bs-link-hover-color: rgb(138.84, 185.4, 254.04);--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: rgb(117, 183, 152.4);--bs-form-valid-border-color: rgb(117, 183, 152.4);--bs-form-invalid-color: rgb(234, 133.8, 143.4);--bs-form-invalid-border-color: rgb(234, 133.8, 143.4)}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, rgb(221.7, 222.3, 222.9));border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}body.quarto-light .dark-content{display:none !important}body.quarto-dark .light-content{display:none !important}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: rgb(221.7, 222.3, 222.9);--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: rgb(206.6, 226, 254.6);--bs-table-border-color: rgb(185.94, 203.4, 229.14);--bs-table-striped-bg: rgb(196.27, 214.7, 241.87);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(185.94, 203.4, 229.14);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(191.105, 209.05, 235.505);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: rgb(225.6, 227.4, 229);--bs-table-border-color: rgb(203.04, 204.66, 206.1);--bs-table-striped-bg: rgb(214.32, 216.03, 217.55);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(203.04, 204.66, 206.1);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(208.68, 210.345, 211.825);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: rgb(209, 231, 220.8);--bs-table-border-color: rgb(188.1, 207.9, 198.72);--bs-table-striped-bg: rgb(198.55, 219.45, 209.76);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(188.1, 207.9, 198.72);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(193.325, 213.675, 204.24);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: rgb(206.6, 244.4, 252);--bs-table-border-color: rgb(185.94, 219.96, 226.8);--bs-table-striped-bg: rgb(196.27, 232.18, 239.4);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(185.94, 219.96, 226.8);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(191.105, 226.07, 233.1);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: rgb(255, 242.6, 205.4);--bs-table-border-color: rgb(229.5, 218.34, 184.86);--bs-table-striped-bg: rgb(242.25, 230.47, 195.13);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(229.5, 218.34, 184.86);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(235.875, 224.405, 189.995);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: rgb(248, 214.6, 217.8);--bs-table-border-color: rgb(223.2, 193.14, 196.02);--bs-table-striped-bg: rgb(235.6, 203.87, 206.91);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 193.14, 196.02);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 198.505, 201.465);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: rgb(223.2, 224.1, 225);--bs-table-striped-bg: rgb(235.6, 236.55, 237.5);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 224.1, 225);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 230.325, 231.25);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: rgb(55.2, 58.8, 62.4);--bs-table-striped-bg: rgb(44.1, 47.9, 51.7);--bs-table-striped-color: #ffffff;--bs-table-active-bg: rgb(55.2, 58.8, 62.4);--bs-table-active-color: #ffffff;--bs-table-hover-bg: rgb(49.65, 53.35, 57.05);--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgb(221.7,222.3,222.9);print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:rgb(182.4,211.5,254.4)}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:rgb(182.4,211.5,254.4)}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(226.95, 230.35, 233.75);--bs-btn-hover-border-color: rgb(225.3, 228.9, 232.5);--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(228.6, 231.8, 235);--bs-btn-active-border-color: rgb(225.3, 228.9, 232.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(11.05, 93.5, 215.05);--bs-btn-hover-border-color: rgb(10.4, 88, 202.4);--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(10.4, 88, 202.4);--bs-btn-active-border-color: rgb(9.75, 82.5, 189.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(91.8, 99.45, 106.25);--bs-btn-hover-border-color: rgb(86.4, 93.6, 100);--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(86.4, 93.6, 100);--bs-btn-active-border-color: rgb(81, 87.75, 93.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(21.25, 114.75, 71.4);--bs-btn-hover-border-color: rgb(20, 108, 67.2);--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(20, 108, 67.2);--bs-btn-active-border-color: rgb(18.75, 101.25, 63);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(49.3, 209.95, 242.25);--bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(61.4, 212.6, 243);--bs-btn-active-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(255, 202.3, 44.2);--bs-btn-hover-border-color: rgb(255, 199.2, 31.8);--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(255, 205.4, 56.6);--bs-btn-active-border-color: rgb(255, 199.2, 31.8);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(187, 45.05, 58.65);--bs-btn-hover-border-color: rgb(176, 42.4, 55.2);--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(176, 42.4, 55.2);--bs-btn-active-border-color: rgb(165, 39.75, 51.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(210.8, 211.65, 212.5);--bs-btn-hover-border-color: rgb(198.4, 199.2, 200);--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(198.4, 199.2, 200);--bs-btn-active-border-color: rgb(186, 186.75, 187.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(66.3, 69.7, 73.1);--bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(77.4, 80.6, 83.8);--bs-btn-active-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: rgb(10.4, 88, 202.4);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: rgb(10.4, 88, 202.4);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: rgb(10.4, 88, 202.4);--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: rgb(221.7, 222.3, 222.9);--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef rgb(221.7, 222.3, 222.9);--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: rgb(221.7, 222.3, 222.9) rgb(221.7, 222.3, 222.9) #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: rgb(253.26, 253.63, 253.98);--bs-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--bs-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--bs-navbar-active-color: rgb(252.58, 253.55, 254.98);--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgb(253.26, 253.63, 253.98);--bs-navbar-brand-hover-color: rgb(252.58, 253.55, 254.98);--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: rgb(253.26, 253.63, 253.98);--bs-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--bs-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--bs-navbar-active-color: rgb(252.58, 253.55, 254.98);--bs-navbar-brand-color: rgb(253.26, 253.63, 253.98);--bs-navbar-brand-hover-color: rgb(252.58, 253.55, 254.98);--bs-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: rgb(221.7, 222.3, 222.9);--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%285.2, 44, 101.2%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: rgb(134, 182.5, 254);--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: rgb(5.2, 44, 101.2);--bs-accordion-active-bg: rgb(206.6, 226, 254.6)}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: rgb(221.7, 222.3, 222.9);--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: rgb(10.4, 88, 202.4);--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: rgb(221.7, 222.3, 222.9);--bs-pagination-focus-color: rgb(10.4, 88, 202.4);--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: rgb(221.7, 222.3, 222.9);display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: rgb(221.7, 222.3, 222.9);--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: rgb(221.7, 222.3, 222.9);--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: rgb(221.7, 222.3, 222.9);--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:hsla(0,0%,100%,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(48.6, 72.4, 248.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,72.4,248.6);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(52.2, 92.4, 229);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,92.4,229);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(93.4, 86.4, 204.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,86.4,204.6);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(95.8, 87.2, 179.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,87.2,179.4);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(109, 116.4, 159.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,116.4,159.8);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 143.2, 154.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,143.2,154.6);color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(17.8, 120, 185.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,120,185.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 146.4, 212.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,146.4,212.2);color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 146.8, 247.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(13,146.8,247.8);color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 53.6, 246.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(66.4,53.6,246.4);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(146.8, 30, 198);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(146.8,30,198);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(149.2, 30.8, 172.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(149.2,30.8,172.8);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(163.2, 86.8, 148);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(163.2,86.8,148);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.2, 63.6, 178.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(71.2,63.6,178.8);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 90.4, 241.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(66.4,90.4,241.2);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.8, 83.6, 217);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(71.8,83.6,217);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(152.2, 60, 168.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(152.2,60,168.6);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(154.6, 60.8, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(154.6,60.8,143.4);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(168.6, 116.8, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(168.6,116.8,118.6);color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(76.6, 93.6, 149.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(76.6,93.6,149.4);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(71.8, 120.4, 211.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(71.8,120.4,211.8);color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(133.6, 74.6, 180.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(133.6,74.6,180.4);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(169.2, 37, 176);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(169.2,37,176);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 57, 156.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(172.8,57,156.4);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(216.4, 51.8, 106.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(216.4,51.8,106.8);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(229.6, 81, 87.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(229.6,81,87.2);color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(230.4, 107.8, 82);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(230.4,107.8,82);color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(138.4, 84.6, 112.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(138.4,84.6,112.8);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(141.2, 111, 139.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(141.2,111,139.6);color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(133.6, 111.4, 175.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(133.6,111.4,175.2);color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(137.2, 75.8, 142.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(137.2,75.8,142.6);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 38.2, 138.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(172.8,38.2,138.2);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(176.4, 58.2, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(176.4,58.2,118.6);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(217.6, 52.2, 94.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(217.6,52.2,94.2);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(233.2, 82.2, 49.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(233.2,82.2,49.4);color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(234, 109, 44.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(234,109,44.2);color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(142, 85.8, 75);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(142,85.8,75);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(144.8, 112.2, 101.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(144.8,112.2,101.8);color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(137.2, 112.6, 137.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(137.2,112.6,137.4);color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 119.6, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(157,119.6,113.2);color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(237.4, 96, 64.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(237.4,96,64.8);color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(239.8, 96.8, 39.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(239.8,96.8,39.6);color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(253.8, 152.8, 14.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(253.8,152.8,14.8);color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(161.8, 129.6, 45.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(161.8,129.6,45.6);color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 156.4, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(157,156.4,108);color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 159.8, 105.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(158.2,159.8,105.4);color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(193.8, 122.2, 101);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(193.8,122.2,101);color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(197.4, 142.2, 81.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(197.4,142.2,81.4);color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(238.6, 136.2, 57);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(238.6,136.2,57);color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(241, 137, 31.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(241,137,31.8);color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(254.2, 166.2, 12.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(254.2,166.2,12.2);color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(163, 169.8, 37.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(163,169.8,37.8);color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(165.8, 196.2, 64.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(165.8,196.2,64.6);color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 196.6, 100.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(158.2,196.6,100.2);color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(20.2, 125, 151.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(20.2,125,151.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(55.8, 87.4, 147.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.8,87.4,147.2);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(59.4, 107.4, 127.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(59.4,107.4,127.6);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(100.6, 101.4, 103.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(100.6,101.4,103.2);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(103, 102.2, 78);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(103,102.2,78);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(116.2, 131.4, 58.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(116.2,131.4,58.4);color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(117, 158.2, 53.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(117,158.2,53.2);color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(27.8, 161.4, 110.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.8,161.4,110.8);color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.2, 161.8, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(20.2,161.8,146.4);color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 164.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(24.4,164.6,191.8);color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(104.8, 141, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(104.8,141,143.4);color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(107.2, 141.8, 118.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(107.2,141.8,118.2);color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(121.2, 197.8, 93.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(121.2,197.8,93.4);color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(29.2, 174.6, 124.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(29.2,174.6,124.2);color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 201.4, 186.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(24.4,201.4,186.6);color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 165.2, 245.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(13,165.2,245.2);color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(48.6, 127.6, 240.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,127.6,240.8);color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(52.2, 147.6, 221.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,147.6,221.2);color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(93.4, 141.6, 196.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,141.6,196.8);color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(95.8, 142.4, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,142.4,171.6);color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(109, 171.6, 152);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,171.6,152);color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 198.4, 146.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,198.4,146.8);color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(17.8, 175.2, 177.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,175.2,177.6);color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 201.6, 204.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,201.6,204.4);color:#000}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(48.6, 72.4, 248.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,72.4,248.6);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(52.2, 92.4, 229);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,92.4,229);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(93.4, 86.4, 204.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,86.4,204.6);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(95.8, 87.2, 179.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,87.2,179.4);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(109, 116.4, 159.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,116.4,159.8);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 143.2, 154.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,143.2,154.6);color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(17.8, 120, 185.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,120,185.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 146.4, 212.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,146.4,212.2);color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 146.8, 247.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(13,146.8,247.8);color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 53.6, 246.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(66.4,53.6,246.4);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(146.8, 30, 198);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(146.8,30,198);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(149.2, 30.8, 172.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(149.2,30.8,172.8);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(163.2, 86.8, 148);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(163.2,86.8,148);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.2, 63.6, 178.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(71.2,63.6,178.8);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 90.4, 241.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(66.4,90.4,241.2);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.8, 83.6, 217);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(71.8,83.6,217);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(152.2, 60, 168.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(152.2,60,168.6);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(154.6, 60.8, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(154.6,60.8,143.4);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(168.6, 116.8, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(168.6,116.8,118.6);color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(76.6, 93.6, 149.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(76.6,93.6,149.4);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(71.8, 120.4, 211.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(71.8,120.4,211.8);color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(133.6, 74.6, 180.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(133.6,74.6,180.4);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(169.2, 37, 176);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(169.2,37,176);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 57, 156.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(172.8,57,156.4);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(216.4, 51.8, 106.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(216.4,51.8,106.8);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(229.6, 81, 87.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(229.6,81,87.2);color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(230.4, 107.8, 82);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(230.4,107.8,82);color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(138.4, 84.6, 112.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(138.4,84.6,112.8);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(141.2, 111, 139.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(141.2,111,139.6);color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(133.6, 111.4, 175.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(133.6,111.4,175.2);color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(137.2, 75.8, 142.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(137.2,75.8,142.6);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 38.2, 138.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(172.8,38.2,138.2);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(176.4, 58.2, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(176.4,58.2,118.6);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(217.6, 52.2, 94.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(217.6,52.2,94.2);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(233.2, 82.2, 49.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(233.2,82.2,49.4);color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(234, 109, 44.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(234,109,44.2);color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(142, 85.8, 75);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(142,85.8,75);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(144.8, 112.2, 101.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(144.8,112.2,101.8);color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(137.2, 112.6, 137.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(137.2,112.6,137.4);color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 119.6, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(157,119.6,113.2);color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(237.4, 96, 64.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(237.4,96,64.8);color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(239.8, 96.8, 39.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(239.8,96.8,39.6);color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(253.8, 152.8, 14.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(253.8,152.8,14.8);color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(161.8, 129.6, 45.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(161.8,129.6,45.6);color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 156.4, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(157,156.4,108);color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 159.8, 105.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(158.2,159.8,105.4);color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(193.8, 122.2, 101);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(193.8,122.2,101);color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(197.4, 142.2, 81.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(197.4,142.2,81.4);color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(238.6, 136.2, 57);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(238.6,136.2,57);color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(241, 137, 31.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(241,137,31.8);color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(254.2, 166.2, 12.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(254.2,166.2,12.2);color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(163, 169.8, 37.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(163,169.8,37.8);color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(165.8, 196.2, 64.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(165.8,196.2,64.6);color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 196.6, 100.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(158.2,196.6,100.2);color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(20.2, 125, 151.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(20.2,125,151.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(55.8, 87.4, 147.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.8,87.4,147.2);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(59.4, 107.4, 127.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(59.4,107.4,127.6);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(100.6, 101.4, 103.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(100.6,101.4,103.2);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(103, 102.2, 78);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(103,102.2,78);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(116.2, 131.4, 58.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(116.2,131.4,58.4);color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(117, 158.2, 53.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(117,158.2,53.2);color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(27.8, 161.4, 110.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.8,161.4,110.8);color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.2, 161.8, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(20.2,161.8,146.4);color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 164.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(24.4,164.6,191.8);color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(104.8, 141, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(104.8,141,143.4);color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(107.2, 141.8, 118.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(107.2,141.8,118.2);color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(121.2, 197.8, 93.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(121.2,197.8,93.4);color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(29.2, 174.6, 124.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(29.2,174.6,124.2);color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 201.4, 186.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(24.4,201.4,186.6);color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 165.2, 245.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(13,165.2,245.2);color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(48.6, 127.6, 240.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,127.6,240.8);color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(52.2, 147.6, 221.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,147.6,221.2);color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(93.4, 141.6, 196.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,141.6,196.8);color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(95.8, 142.4, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,142.4,171.6);color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(109, 171.6, 152);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,171.6,152);color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 198.4, 146.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,198.4,146.8);color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(17.8, 175.2, 177.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,175.2,177.6);color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 201.6, 204.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,201.6,204.4);color:#000}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid rgb(221.7,222.3,222.9)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px rgb(221.7,222.3,222.9);border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:rgb(221.7,222.3,222.9);border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:rgb(221.7,222.3,222.9);border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:rgb(221.7,222.3,222.9);border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:rgb(221.7,222.3,222.9)}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}div.code-copy-outer-scaffold{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: rgb(221.7, 222.3, 222.9);--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button-tooltip{font-size:.75em}div.code-copy-outer-scaffold:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}div.code-copy-outer-scaffold:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}div.code-copy-outer-scaffold:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}div.code-copy-outer-scaffold:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>p:has(+section){margin-bottom:2rem}main.content>section:first-of-type>h2:nth-child(1),main.content>section:first-of-type>.h2:nth-child(1){margin-top:0}h2,.h2{border-bottom:1px solid rgb(221.7,222.3,222.9);padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:hsl(210,10.8108108108%,39.5098039216%)}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:hsl(210,10.8108108108%,39.5098039216%)}.quarto-layout-cell[data-ref-parent] caption{color:hsl(210,10.8108108108%,39.5098039216%)}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:hsl(210,10.8108108108%,39.5098039216%);font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:rgb(221.7,222.3,222.9) 1px solid;border-right:rgb(221.7,222.3,222.9) 1px solid;border-bottom:rgb(221.7,222.3,222.9) 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow-y:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:hsl(210,10.8108108108%,39.5098039216%)}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code.sourceCode,li code.sourceCode,td code.sourceCode{background-color:rgba(233,236,239,.65)}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:rgba(233,236,239,.65);padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:rgb(221.7,222.3,222.9)}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid rgb(221.7,222.3,222.9);border-top:1px solid rgb(221.7,222.3,222.9);border-bottom:1px solid rgb(221.7,222.3,222.9)}.callout.callout-style-default{border-left:5px solid;border-right:1px solid rgb(221.7,222.3,222.9);border-top:1px solid rgb(221.7,222.3,222.9);border-bottom:1px solid rgb(221.7,222.3,222.9)}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400;margin-bottom:-0.4em;margin-top:.5em}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-empty-content>.callout-header{margin-bottom:0em;border-bottom-right-radius:calc(0.375rem + -1px)}.callout>.callout-header.collapsed{border-bottom-right-radius:calc(0.375rem + -1px)}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em;border-top-right-radius:calc(0.375rem + -1px)}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:rgb(230.8,240.5,254.8)}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:rgb(232,243,237.9)}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:rgb(255,248.8,230.2)}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:rgb(254.8,242.1,231.5)}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:rgb(251.5,234.8,236.4)}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:rgb(253.26,253.63,253.98)}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:rgb(221.7,222.3,222.9);border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:hsl(0,0%,98%)}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:rgb(221.7,222.3,222.9);margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid rgb(221.7,222.3,222.9) 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid rgb(221.7,222.3,222.9)}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px rgb(221.7,222.3,222.9);margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px rgb(221.7,222.3,222.9);margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: rgb(253.53, 253.62, 253.7);--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: rgb(253.53, 253.62, 253.7);--bs-btn-hover-bg: rgb(130.05, 137.7, 144.5);--bs-btn-hover-border-color: rgb(122.7, 130.8, 138);--bs-btn-focus-shadow-rgb: 130, 137, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(137.4, 144.6, 151);--bs-btn-active-border-color: rgb(122.7, 130.8, 138);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:rgb(253.26,253.63,253.98)}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:rgb(253.26,253.63,253.98)}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:rgb(55.7432432432,62.5,69.2567567568);border:solid rgb(55.7432432432,62.5,69.2567567568) 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid rgb(210.6,211.4,212.2);border-bottom:1px solid rgb(210.6,211.4,212.2)}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}.screen-reader-only{position:absolute;clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:rgb(253.26,253.63,253.98);background:#517699}.quarto-title-banner a{color:rgb(253.26,253.63,253.98)}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:rgb(253.26,253.63,253.98)}.quarto-title-banner .code-tools-button{color:rgb(188.9556521739,202.9995652174,216.2843478261)}.quarto-title-banner .code-tools-button:hover{color:rgb(253.26,253.63,253.98)}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: rgb(253.53, 253.62, 253.7);--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: rgb(253.26, 253.63, 253.98);--quarto-scss-export-navbar-hl: rgb(252.58, 253.55, 254.98);--quarto-scss-export-navbar-brand: rgb(253.26, 253.63, 253.98);--quarto-scss-export-navbar-brand-hl: rgb(252.58, 253.55, 254.98);--quarto-scss-export-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--quarto-scss-export-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--quarto-scss-export-sidebar-fg: rgb(89.25, 89.25, 89.25);--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: rgb(117.3, 117.3, 117.3);--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: rgb(210.6, 211.4, 212.2);--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-table-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: rgb(206.6, 226, 254.6);--quarto-scss-export-blue-200: rgb(158.2, 197, 254.2);--quarto-scss-export-blue-300: rgb(109.8, 168, 253.8);--quarto-scss-export-blue-400: rgb(61.4, 139, 253.4);--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: rgb(10.4, 88, 202.4);--quarto-scss-export-blue-700: rgb(7.8, 66, 151.8);--quarto-scss-export-blue-800: rgb(5.2, 44, 101.2);--quarto-scss-export-blue-900: rgb(2.6, 22, 50.6);--quarto-scss-export-indigo-100: rgb(224.4, 207.2, 252.4);--quarto-scss-export-indigo-200: rgb(193.8, 159.4, 249.8);--quarto-scss-export-indigo-300: rgb(163.2, 111.6, 247.2);--quarto-scss-export-indigo-400: rgb(132.6, 63.8, 244.6);--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: rgb(81.6, 12.8, 193.6);--quarto-scss-export-indigo-700: rgb(61.2, 9.6, 145.2);--quarto-scss-export-indigo-800: rgb(40.8, 6.4, 96.8);--quarto-scss-export-indigo-900: rgb(20.4, 3.2, 48.4);--quarto-scss-export-purple-100: rgb(226.2, 217.2, 242.6);--quarto-scss-export-purple-200: rgb(197.4, 179.4, 230.2);--quarto-scss-export-purple-300: rgb(168.6, 141.6, 217.8);--quarto-scss-export-purple-400: rgb(139.8, 103.8, 205.4);--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: rgb(88.8, 52.8, 154.4);--quarto-scss-export-purple-700: rgb(66.6, 39.6, 115.8);--quarto-scss-export-purple-800: rgb(44.4, 26.4, 77.2);--quarto-scss-export-purple-900: rgb(22.2, 13.2, 38.6);--quarto-scss-export-pink-100: rgb(246.8, 214.2, 230.4);--quarto-scss-export-pink-200: rgb(238.6, 173.4, 205.8);--quarto-scss-export-pink-300: rgb(230.4, 132.6, 181.2);--quarto-scss-export-pink-400: rgb(222.2, 91.8, 156.6);--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: rgb(171.2, 40.8, 105.6);--quarto-scss-export-pink-700: rgb(128.4, 30.6, 79.2);--quarto-scss-export-pink-800: rgb(85.6, 20.4, 52.8);--quarto-scss-export-pink-900: rgb(42.8, 10.2, 26.4);--quarto-scss-export-red-100: rgb(248, 214.6, 217.8);--quarto-scss-export-red-200: rgb(241, 174.2, 180.6);--quarto-scss-export-red-300: rgb(234, 133.8, 143.4);--quarto-scss-export-red-400: rgb(227, 93.4, 106.2);--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: rgb(176, 42.4, 55.2);--quarto-scss-export-red-700: rgb(132, 31.8, 41.4);--quarto-scss-export-red-800: rgb(88, 21.2, 27.6);--quarto-scss-export-red-900: rgb(44, 10.6, 13.8);--quarto-scss-export-orange-100: rgb(254.6, 229.2, 208);--quarto-scss-export-orange-200: rgb(254.2, 203.4, 161);--quarto-scss-export-orange-300: rgb(253.8, 177.6, 114);--quarto-scss-export-orange-400: rgb(253.4, 151.8, 67);--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: rgb(202.4, 100.8, 16);--quarto-scss-export-orange-700: rgb(151.8, 75.6, 12);--quarto-scss-export-orange-800: rgb(101.2, 50.4, 8);--quarto-scss-export-orange-900: rgb(50.6, 25.2, 4);--quarto-scss-export-yellow-100: rgb(255, 242.6, 205.4);--quarto-scss-export-yellow-200: rgb(255, 230.2, 155.8);--quarto-scss-export-yellow-300: rgb(255, 217.8, 106.2);--quarto-scss-export-yellow-400: rgb(255, 205.4, 56.6);--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: rgb(204, 154.4, 5.6);--quarto-scss-export-yellow-700: rgb(153, 115.8, 4.2);--quarto-scss-export-yellow-800: rgb(102, 77.2, 2.8);--quarto-scss-export-yellow-900: rgb(51, 38.6, 1.4);--quarto-scss-export-green-100: rgb(209, 231, 220.8);--quarto-scss-export-green-200: rgb(163, 207, 186.6);--quarto-scss-export-green-300: rgb(117, 183, 152.4);--quarto-scss-export-green-400: rgb(71, 159, 118.2);--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: rgb(20, 108, 67.2);--quarto-scss-export-green-700: rgb(15, 81, 50.4);--quarto-scss-export-green-800: rgb(10, 54, 33.6);--quarto-scss-export-green-900: rgb(5, 27, 16.8);--quarto-scss-export-teal-100: rgb(210.4, 244.2, 234.2);--quarto-scss-export-teal-200: rgb(165.8, 233.4, 213.4);--quarto-scss-export-teal-300: rgb(121.2, 222.6, 192.6);--quarto-scss-export-teal-400: rgb(76.6, 211.8, 171.8);--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: rgb(25.6, 160.8, 120.8);--quarto-scss-export-teal-700: rgb(19.2, 120.6, 90.6);--quarto-scss-export-teal-800: rgb(12.8, 80.4, 60.4);--quarto-scss-export-teal-900: rgb(6.4, 40.2, 30.2);--quarto-scss-export-cyan-100: rgb(206.6, 244.4, 252);--quarto-scss-export-cyan-200: rgb(158.2, 233.8, 249);--quarto-scss-export-cyan-300: rgb(109.8, 223.2, 246);--quarto-scss-export-cyan-400: rgb(61.4, 212.6, 243);--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: rgb(10.4, 161.6, 192);--quarto-scss-export-cyan-700: rgb(7.8, 121.2, 144);--quarto-scss-export-cyan-800: rgb(5.2, 80.8, 96);--quarto-scss-export-cyan-900: rgb(2.6, 40.4, 48);--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: rgb(5.2, 44, 101.2);--quarto-scss-export-secondary-text-emphasis: rgb(43.2, 46.8, 50);--quarto-scss-export-success-text-emphasis: rgb(10, 54, 33.6);--quarto-scss-export-info-text-emphasis: rgb(5.2, 80.8, 96);--quarto-scss-export-warning-text-emphasis: rgb(102, 77.2, 2.8);--quarto-scss-export-danger-text-emphasis: rgb(88, 21.2, 27.6);--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: rgb(206.6, 226, 254.6);--quarto-scss-export-secondary-bg-subtle: rgb(225.6, 227.4, 229);--quarto-scss-export-success-bg-subtle: rgb(209, 231, 220.8);--quarto-scss-export-info-bg-subtle: rgb(206.6, 244.4, 252);--quarto-scss-export-warning-bg-subtle: rgb(255, 242.6, 205.4);--quarto-scss-export-danger-bg-subtle: rgb(248, 214.6, 217.8);--quarto-scss-export-light-bg-subtle: rgb(251.5, 252, 252.5);--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: rgb(158.2, 197, 254.2);--quarto-scss-export-secondary-border-subtle: rgb(196.2, 199.8, 203);--quarto-scss-export-success-border-subtle: rgb(163, 207, 186.6);--quarto-scss-export-info-border-subtle: rgb(158.2, 233.8, 249);--quarto-scss-export-warning-border-subtle: rgb(255, 230.2, 155.8);--quarto-scss-export-danger-border-subtle: rgb(241, 174.2, 180.6);--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: rgb(255, 242.6, 205.4);--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: rgb(134, 182.5, 254);--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: rgb(134, 182.5, 254);--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-form-select-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: rgb(182.4, 211.5, 254.4);--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef rgb(221.7, 222.3, 222.9);--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-pagination-focus-color: rgb(10.4, 88, 202.4);--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: rgb(206.6, 226, 254.6);--quarto-scss-export-accordion-button-active-color: rgb(5.2, 44, 101.2);--quarto-scss-export-accordion-button-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: rgb(5.2, 44, 101.2);--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--quarto-scss-export-mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.css b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..82b40f5 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2106 @@ +/*! + * Bootstrap Icons v1.13.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?e34853135f9e39acf64315236852cd5a") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } +.bi-bluesky::before { content: "\f7f9"; } +.bi-tux::before { content: "\f904"; } +.bi-beaker-fill::before { content: "\f905"; } +.bi-beaker::before { content: "\f906"; } +.bi-flask-fill::before { content: "\f907"; } +.bi-flask-florence-fill::before { content: "\f908"; } +.bi-flask-florence::before { content: "\f909"; } +.bi-flask::before { content: "\f90a"; } +.bi-leaf-fill::before { content: "\f90b"; } +.bi-leaf::before { content: "\f90c"; } +.bi-measuring-cup-fill::before { content: "\f90d"; } +.bi-measuring-cup::before { content: "\f90e"; } +.bi-unlock2-fill::before { content: "\f90f"; } +.bi-unlock2::before { content: "\f910"; } +.bi-battery-low::before { content: "\f911"; } +.bi-anthropic::before { content: "\f912"; } +.bi-apple-music::before { content: "\f913"; } +.bi-claude::before { content: "\f914"; } +.bi-openai::before { content: "\f915"; } +.bi-perplexity::before { content: "\f916"; } +.bi-css::before { content: "\f917"; } +.bi-javascript::before { content: "\f918"; } +.bi-typescript::before { content: "\f919"; } +.bi-fork-knife::before { content: "\f91a"; } +.bi-globe-americas-fill::before { content: "\f91b"; } +.bi-globe-asia-australia-fill::before { content: "\f91c"; } +.bi-globe-central-south-asia-fill::before { content: "\f91d"; } +.bi-globe-europe-africa-fill::before { content: "\f91e"; } diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.woff b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000..a4fa4f0 Binary files /dev/null and b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap-icons.woff differ diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap.min.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/clipboard/clipboard.min.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/axe/axe-check.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/axe/axe-check.js new file mode 100644 index 0000000..8808085 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/axe/axe-check.js @@ -0,0 +1,145 @@ +class QuartoAxeReporter { + constructor(axeResult, options) { + this.axeResult = axeResult; + this.options = options; + } + + report() { + throw new Error("report() is an abstract method"); + } +} + +class QuartoAxeJsonReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + report() { + console.log(JSON.stringify(this.axeResult, null, 2)); + } +} + +class QuartoAxeConsoleReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + report() { + for (const violation of this.axeResult.violations) { + console.log(violation.description); + for (const node of violation.nodes) { + for (const target of node.target) { + console.log(target); + console.log(document.querySelector(target)); + } + } + } + } +} + +class QuartoAxeDocumentReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + createViolationElement(violation) { + const violationElement = document.createElement("div"); + + const descriptionElement = document.createElement("div"); + descriptionElement.className = "quarto-axe-violation-description"; + descriptionElement.innerText = `${violation.impact.replace(/^[a-z]/, match => match.toLocaleUpperCase())}: ${violation.description}`; + violationElement.appendChild(descriptionElement); + + const helpElement = document.createElement("div"); + helpElement.className = "quarto-axe-violation-help"; + helpElement.innerText = violation.help; + violationElement.appendChild(helpElement); + + const nodesElement = document.createElement("div"); + nodesElement.className = "quarto-axe-violation-nodes"; + violationElement.appendChild(nodesElement); + const nodeElement = document.createElement("div"); + nodeElement.className = "quarto-axe-violation-selector"; + for (const node of violation.nodes) { + for (const target of node.target) { + const targetElement = document.createElement("span"); + targetElement.className = "quarto-axe-violation-target"; + targetElement.innerText = target; + nodeElement.appendChild(targetElement); + nodeElement.addEventListener("mouseenter", () => { + const element = document.querySelector(target); + if (element) { + element.scrollIntoView({ behavior: "smooth", block: "center" }); + element.classList.add("quarto-axe-hover-highlight"); + setTimeout(() => { + element.style.border = ""; + }, 2000); + } + }); + nodeElement.addEventListener("mouseleave", () => { + const element = document.querySelector(target); + if (element) { + element.classList.remove("quarto-axe-hover-highlight"); + } + }); + nodeElement.addEventListener("click", () => { + console.log(document.querySelector(target)); + }); + nodeElement.appendChild(targetElement); + } + nodesElement.appendChild(nodeElement); + } + return violationElement; + } + + report() { + const violations = this.axeResult.violations; + const reportElement = document.createElement("div"); + reportElement.className = "quarto-axe-report"; + if (violations.length === 0) { + const noViolationsElement = document.createElement("div"); + noViolationsElement.className = "quarto-axe-no-violations"; + noViolationsElement.innerText = "No axe-core violations found."; + reportElement.appendChild(noViolationsElement); + } + violations.forEach((violation) => { + reportElement.appendChild(this.createViolationElement(violation)); + }); + document.querySelector("main").appendChild(reportElement); + } +} + +const reporters = { + json: QuartoAxeJsonReporter, + console: QuartoAxeConsoleReporter, + document: QuartoAxeDocumentReporter, +}; + +class QuartoAxeChecker { + constructor(opts) { + this.options = opts; + } + async init() { + const axe = (await import("https://cdn.skypack.dev/pin/axe-core@v4.10.3-aVOFXWsJaCpVrtv89pCa/mode=imports,min/optimized/axe-core.js")).default; + const result = await axe.run({ + exclude: [ + // https://github.com/microsoft/tabster/issues/288 + // MS has claimed they won't fix this, so we need to add an exclusion to + // all tabster elements + "[data-tabster-dummy]" + ], + preload: { assets: ['cssom'], timeout: 50000 } + }); + const reporter = this.options === true ? new QuartoAxeConsoleReporter(result) : new reporters[this.options.output](result, this.options); + reporter.report(); + } +} + +export async function init() { + const opts = document.querySelector("#quarto-axe-checker-options"); + if (opts) { + const jsonOptions = JSON.parse(atob(opts.textContent)); + const checker = new QuartoAxeChecker(jsonOptions); + await checker.init(); + } +} \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/popper.min.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/popper.min.js new file mode 100644 index 0000000..e3726d7 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css new file mode 100644 index 0000000..7bb4f73 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css @@ -0,0 +1,236 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +/* syntax highlight based on Pandoc's rules */ +pre > code.sourceCode > span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +/* Normal */ +code span { + color: #003B4F; +} + +/* Alert */ +code span.al { + color: #AD0000; + font-style: inherit; +} + +/* Annotation */ +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +/* Attribute */ +code span.at { + color: #657422; + font-style: inherit; +} + +/* BaseN */ +code span.bn { + color: #AD0000; + font-style: inherit; +} + +/* BuiltIn */ +code span.bu { + font-style: inherit; +} + +/* ControlFlow */ +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Char */ +code span.ch { + color: #20794D; + font-style: inherit; +} + +/* Constant */ +code span.cn { + color: #8f5902; + font-style: inherit; +} + +/* Comment */ +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +/* CommentVar */ +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +/* Documentation */ +code span.do { + color: #5E5E5E; + font-style: italic; +} + +/* DataType */ +code span.dt { + color: #AD0000; + font-style: inherit; +} + +/* DecVal */ +code span.dv { + color: #AD0000; + font-style: inherit; +} + +/* Error */ +code span.er { + color: #AD0000; + font-style: inherit; +} + +/* Extension */ +code span.ex { + font-style: inherit; +} + +/* Float */ +code span.fl { + color: #AD0000; + font-style: inherit; +} + +/* Function */ +code span.fu { + color: #4758AB; + font-style: inherit; +} + +/* Import */ +code span.im { + color: #00769E; + font-style: inherit; +} + +/* Information */ +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +/* Keyword */ +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Operator */ +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +/* Other */ +code span.ot { + color: #003B4F; + font-style: inherit; +} + +/* Preprocessor */ +code span.pp { + color: #AD0000; + font-style: inherit; +} + +/* SpecialChar */ +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +/* SpecialString */ +code span.ss { + color: #20794D; + font-style: inherit; +} + +/* String */ +code span.st { + color: #20794D; + font-style: inherit; +} + +/* Variable */ +code span.va { + color: #111111; + font-style: inherit; +} + +/* VerbatimString */ +code span.vs { + color: #20794D; + font-style: inherit; +} + +/* Warning */ +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // dispatch for htmlwidgets + // they use slideenter event to trigger resize + function fireSlideEnter() { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // dispatch for shiny + // they use BS shown and hidden events to trigger rendering + function distpatchShinyEvents(previous, current) { + if (window.jQuery) { + if (previous) { + window.jQuery(previous).trigger("hidden"); + } + if (current) { + window.jQuery(current).trigger("shown"); + } + } + } + + // tabby.js listener: Trigger event for htmlwidget and shiny + document.addEventListener( + "tabby", + function (event) { + fireSlideEnter(); + distpatchShinyEvents(event.detail.previousTab, event.detail.tab); + }, + false + ); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + // Categories search with listing only use path without query + const currentPagePath = offsetAbsoluteUrl( + window.location.origin + window.location.pathname + ); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + const encodedItem = encodeURI(item); + if ( + encodedItem === currentPagePath || + encodedItem === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (const child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +tabsets.init(); +axe.init(); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tabsets/tabsets.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tabsets/tabsets.js new file mode 100644 index 0000000..51345d0 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tabsets/tabsets.js @@ -0,0 +1,95 @@ +// grouped tabsets + +export function init() { + window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } + }); +} diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.css b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.umd.min.js b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/Week2Homework_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_INF052_00.fcs b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_INF052_00.fcs new file mode 100644 index 0000000..9dfa197 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_INF052_00.fcs @@ -0,0 +1,65 @@ +FCS3.0 58 18368 18369 36368 0 0#$BEGINANALYSIS#0#$BEGINDATA#18369#$BEGINSTEXT#0#$BTIM#13:45:15.97#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#R0026#$DATATYPE#F#$DATE#25-Jul-2025#$ENDANALYSIS#0#$ENDDATA#36368#$ENDSTEXT#0#$ETIM#13:45:44.73#$FIL#CellCounts3L_AB_02-INF052-00.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#V7-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#449#$P11B#32#$P11E#0,0#$P11N#V8-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#807#$P12B#32#$P12E#0,0#$P12N#V9-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#652#$P13B#32#$P13E#0,0#$P13N#V10-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#512#$P14B#32#$P14E#0,0#$P14N#V11-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#399#$P15B#32#$P15E#0,0#$P15N#V12-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#344#$P16B#32#$P16E#0,0#$P16N#V13-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#352#$P17B#32#$P17E#0,0#$P17N#V14-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#549#$P18B#32#$P18E#0,0#$P18N#V15-A#$P18R#4194304#$P18TYPE#Raw_Fluorescence#$P18V#637#$P19B#32#$P19E#0,0#$P19N#V16-A#$P19R#4194304#$P19TYPE#Raw_Fluorescence#$P19V#562#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#287375#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#FSC-H#$P20R#4194304#$P20TYPE#Forward_Scatter#$P20V#49#$P21B#32#$P21E#0,0#$P21N#FSC-A#$P21R#4194304#$P21TYPE#Forward_Scatter#$P21V#49#$P22B#32#$P22E#0,0#$P22N#SSC-B-H#$P22R#4194304#$P22TYPE#Side_Scatter#$P22V#339#$P23B#32#$P23E#0,0#$P23N#SSC-B-A#$P23R#4194304#$P23TYPE#Side_Scatter#$P23V#339#$P24B#32#$P24E#0,0#$P24N#B1-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#682#$P25B#32#$P25E#0,0#$P25N#B2-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#400#$P26B#32#$P26E#0,0#$P26N#B3-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#421#$P27B#32#$P27E#0,0#$P27N#B4-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#406#$P28B#32#$P28E#0,0#$P28N#B5-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#343#$P29B#32#$P29E#0,0#$P29N#B6-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#249#$P2B#32#$P2E#0,0#$P2N#SSC-H#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#730#$P30B#32#$P30E#0,0#$P30N#B7-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#457#$P31B#32#$P31E#0,0#$P31N#B8-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#392#$P32B#32#$P32E#0,0#$P32N#B9-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#516#$P33B#32#$P33E#0,0#$P33N#B10-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#385#$P34B#32#$P34E#0,0#$P34N#B11-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#299#$P35B#32#$P35E#0,0#$P35N#B12-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#422#$P36B#32#$P36E#0,0#$P36N#B13-A#$P36R#4194304#$P36TYPE#Raw_Fluorescence#$P36V#490#$P37B#32#$P37E#0,0#$P37N#B14-A#$P37R#4194304#$P37TYPE#Raw_Fluorescence#$P37V#586#$P38B#32#$P38E#0,0#$P38N#R1-A#$P38R#4194304#$P38TYPE#Raw_Fluorescence#$P38V#230#$P39B#32#$P39E#0,0#$P39N#R2-A#$P39R#4194304#$P39TYPE#Raw_Fluorescence#$P39V#294#$P3B#32#$P3E#0,0#$P3N#SSC-A#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#730#$P40B#32#$P40E#0,0#$P40N#R3-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#372#$P41B#32#$P41E#0,0#$P41N#R4-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#348#$P42B#32#$P42E#0,0#$P42N#R5-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#352#$P43B#32#$P43E#0,0#$P43N#R6-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#364#$P44B#32#$P44E#0,0#$P44N#R7-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#851#$P45B#32#$P45E#0,0#$P45N#R8-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#418#$P4B#32#$P4E#0,0#$P4N#V1-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#370#$P5B#32#$P5E#0,0#$P5N#V2-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#384#$P6B#32#$P6E#0,0#$P6N#V3-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#487#$P7B#32#$P7E#0,0#$P7N#V4-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#295#$P8B#32#$P8E#0,0#$P8N#V5-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#381#$P9B#32#$P9E#0,0#$P9N#V6-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#335#$PAR#45#$PROJ#CellCounts3L_AB_02#$SPILLOVER#38,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.84#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts3L_AB_02-INF052-00.fcs#FSC ASF#1.1#GROUPNAME#INF052#GUID#CellCounts3L_AB_02-INF052-00.fcs#LASER1ASF#1.03#LASER1DELAY#-27.925#LASER1NAME#Violet#LASER2ASF#1.09#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#27.55#LASER3NAME#Red#ORIGINALGUID#f9a9038d-7246-4872-9c98-55a7406b08b8#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LIN#P21DISPLAY#LIN#P22DISPLAY#LIN#P23DISPLAY#LIN#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P4DISPLAY#LOG#P5DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#2#HUIhI]C%D0'DFD"%EиE/EE6E HEHDDAC%CCK?C:IIԐI$IoDRD#E&F-ZkEYE?D_8DDbCD߅)C2DB]mDD$FCpY}*v%BH H"H @HyCBæʎC"#4E +?wDHrDk>gCYC XCj}„MApCqC-PC H I.HàHJ\DلDǁE/qtEsKEyMDD7D;D'3D.ރD4fAYBD3@OC΢>CÕCé[CI-hBԧGHVHmCL¥9C_D=tCZCCDrDWDn(CC)ݡC4|C?CH +H M GGCCBCAE%D-Dʄ[DeyD'oBWP{mCBV7Bҭ¤}YÒPAO\B1CמCX/FH߀I)4CvD}aLD-XD-[`D{DE3 E֚E#EyD)Dw;DzxCPDd1H(0@HpOHu@ISDDJ^D99EDlDbDhلD!Dp";CzC5@CpfBÙCV>CCZ|'^~¤XCBAJCWIpH+ɀJxPJVQDDVDmeDADE +VE`0IKI0J +zD5DE9G;GFEElE~E-D+TDwCvDzDтDyeDODFfD-CD&Bs=GHSH犋D;DCD)CM@D +DDhEDE +mD# Dn +CCnC(CJI./IhMHI D,DDMDxDiD"DhBCpcCÀCD.BC"guCp>CSCD:4BTB5BµC;˜FIAK`IpXDd *DgDqfD@E\EsE]_EPWDGEdzDD}|CdC5HDPQ6CTIPIގhI1{IaDTDEEbGODD>DD$OnCe.DFeCStCt]vC?DZ2CyCkDHÍ $C:,ƒxHFIpI +C C CCC̄CcD+ĢG5vGRE(ECtD0DD}CHߠHކH:H?9CC[ EHk2vGGy.F3FI_*F+[(D`DycD>o Dt+FE%E9D/cDo;C C,C +B9EIQIOaIxqI4D#aCDG +fF@F 3EPjDdFELDKx#CB6"nC)CݺC.C#B3CCC>lC׵<@T[H!=Hfc@H`G5CmCzBe1 R&3C +cTCT7T-BZh +ɗ\`COHQH?tvHY Ht/wC:y{BйUCSf3ç)ÓC9mB>~r.B)BSa)ÔGAB +AˆBæF5~GxHH1CэC2*>DVHC%DBU?DqD+DqDG,C#CACC%BCx~7H¾HHπHC8BȒCcE:DxDZMC$XD.9C)>CpuBIB ArCNCBpAΡY8~gZˆFH#HOB/B(C^FD6[DD߸DDD-DFD8DD:2CCYTCNHHRH1H HDeCBDKD {C߄DbwD2D +D](4nBŒvC =CCn³;|)5CPrûBYAi;G﯀HRHBC{CmD 0lD7)DD/_EEYE%EDD }D;DA[C`IC;HKHH8BHgKD,D\DD?DDjD=C 'CD@A3CMC5C_B݃-BBxB|{B@±C1CHUwIWID|GDEsEEDE.b9GGFl\EvEǻDmD5D)D+۫I(@IAIXI DD>DXHEsvH-|GnG:.FTDFE`E}D<DD{%D8CD#D1D upDRkC<C…HHu5@HXD &C{D DDE|D*DrDDD{,DkD|ChUCCBCQI&+@IFA>HH!Cr?D`kDD\DC)iDZICeC"CCAC"NC;%C%99–YBfC< 'Ѩ8HkmH +\@HC37CXkvB#CAt_CLCC;CCA&vA)sAGGGGCg@d C)DsJ)Cq8P,FCBBCL>ÎAmxAfCh¼ӯ8UBBVÁDGHb@Hn|[DAۤCPB+CٯCq C"\CD!mD=+Es]EF[DkDPDR~DDqz|I=vIUuHaHD,$3Dhl7D DLDSZD{CC*cCOlvrC<@A¶\)C-?Bbw$%CjH^HIHHBïBHyCs:DD Cm'DsRDSC/]BrBCGBqC‹HHH @H LyCCC%CE0DmkCCCuCMC|9Ñ?5B$AoCf1,C6BBU$CߙCAGI>pI8D)юDxZDDD[DDoxEE(Ef6EfQhE҅E +-E3DuDcǠCCI$xI@II8DD 4DuEBE-/DDWDbwDwHB4QD@CEelCXDV0C;%C()CwC/PrD>C#d3HnHq2@HDK!kD\D1RD,DZӣDMDE",DQEeDdTDD1;D)OCL*H`HoHeHD,D)DdCDCDD9OC0DҜC1.CD3CS, CIeCtxDgBïpC¸{XAuBHgH%I\CvDUD@DC~CjVDRYGWF[F SEJiD>D3RD$pXDCdzuHNHPHyH2D XEkHG]G1FK@EE@XEOD DzHDD cCݴnCZIBQCDAږCC\HsGGWB*CS=CTCyBBAÖDlDMD#CuQhKCpZW@ρGQ'G>G0G]i-CWqE>EDhCD%gCCFCFBRwPBq`CjB`C[\BօŒ|ȾCUjGEH9HjYXČôUCv\CCC~WDaD*C}CP>$BclAEHKH|]H\HaË( R|C9DD׊D#@D D BB^:Ñ!K``Co:,C +CKCPSXQB H(H HACC@HXCh3\ICZCC{D7CB0KBPB9hCC'GɀGiH#1@H:NBzaP&B)DUDESLDOkCB@3C‘m}[nCzCDECrMCui]P@8C=ȍ^G/IpIIDERHBސD@LDMiDDwD\ D"uD>DѱD.DFu&}:D&C[SIOIwIICjDDCDoC.C3CA}dNBaCUB!ÉD&CmYӬD5C C N(DvBiHpI6I_D,BϊC[Co3CђD O ACQD;}CC\RC~D?@7a]H0 HI XITSBaB uJCkqDA`rC##CbCPžZqCҰAChCorBnãC(ȯCY#—sXH?xHzHH'CuvCp,zBW/C7CDDVD|=>D+WCND=CݩSC\ +CYCCDB^G]GHHD- D D&D,pD?mD/jCMnA!#CPSCB̍S7NkCt+:@ ALh| +;Y,uCGɎJc|JEߧE,E/oDE pDWE:F=F_=F(EtZD%+DTxDDCIaInJJv.Dm;DE\G{F1FtEQGEkPEMGD+D.XD\Dd2C/DD4eD%D#C拺C?CީDHHCHP|B %!CjCgCCC>]EhD!+CŽXAcCTB,K@ݜ6HHsH@H(<˧ôAqED$DcCD2CDaAÔQ˜9C65r?@ 0?B3C(B\AЇH #H HC&DERHDx[BrDDDDDDID[DD4D*ODD`D)I + I8LHnHC :Dz/D DD:DhD#BdC}C]¤C ICSzCSB XC6sBuCCwOJpCqTC8U6H[WHsKHC|D-U;DDD\CW|DNEDD[D@8D}CnDmB$CEBHHKZHMH CQC%DUEBܮD2D1dBoC D{CB;4BBD C02)DÀvCBC"BѨ¯6TGH@HD>;8C#8CIDDDiDtD*DDDZD DD7C/l¤Cd(HEրHHfHHD1şD7ڌDdMDvD!D D, DQCYB@C^C!C!CB C4a3B3C+CIOZC-CHn@I& IBD+8>D-DtDQD DmEtvHEGG|b7FIE&jE_HRE XDc$CnIpII.?IICƐDtkdF +r+HHgpGYG0uFˀF8FE9E@E.PE)A+\oA?rÃu C4C~(HyHHHjCK%sDCI CIDw +DE/'E-E&/EDhbFDDAD/kBcD'?G>G~HKHjD2D ID\D|\DD)=C(DA8Cx2CGkCgC<buBKѡB(C:DRCBy(>C7!H-,Io2pIDDzDSdDDVD +DiE>HuH2GfF3F@EE3'E<DJIR(IrI@,0Ie/D7E9FviI>+HHIGG!+G\F|E0ZEAE{ɾEpBNhC#C¥C]C^o~F I$IGn*G q8FF_EEEV{ELkû6tykC9CsuïxD!}b H^`HHB[4BغCEIC-Ch6CE}KEGEDsCCɉC C+Bo$H6HHOHb|BdB1C@RFAEݿ,ETz"D3ICG C^JÃCWOAzFCV:CA E1BRCCHC9HHUWHcl:BHWBCxCe›$BCE6DqDB!C1Cm(BQAAρG'GH<9HKÍI'IVDi.DGBCuDD#D +E9qEDEEhDCCCѶCxyDF +I}6I|I#IID DKE1E_BE+D/C2CBr#ÊgpCC#A\@CʮÕfCdnFCoWôlAƼFI~IęD=DXUDfDHBDDoE99F(FJF%vEDDDbDdzeD4>DgZUH~ҀHIQ8ID,:DE:GvF'FKEһEdwEMDFDsDO.`CftDFDh0Dh\DZ^Dn)DaC/hCD"H1IJJr{E,EVdmE=Er@EҎE7IF4GH˹HBh H +v4F`FCEE}EhĈDkIiI#IΨJVDIEF!IgHHt}GGCG.AF[BF)E:#E EEWEEk%EDLI@JI%J +3E{IEuF2pI֊I$HLGwGjGH F}F$Eu ExEFE;EqEEdvD DjDwHkiIIzDDDrDfތDPDnEr-FF$FmE%-DDwDt?D?54DvIDI3II=KD;fDE$sGWpFFjE{EHfEA_ODCfDCsDa/DQFDƬD2KCD'MCu#GG1H/HJCoCåCH +¬7D=EW +EkeDCUC7mB=.Cc7BeGGH: HQVCAcA\&C5HF&1YEX0E!$;DoDNCMCnxB:0@B:B4CÐB^&lX1FI0I%D]EEnE%3EmErFHH=HF/F4[EsE_E: D׽I0JIPIpeD5IE{ FIgHwHsGi GEPG,ZFF EɥSEvEyEѥ^EǻENmE4E):Dl2DADKGxG}G8C|VC|X"BY.D+\D0jDBjC0D-iCHBB)GGuGyfGCn@C~D:1C!Cq=CTCBQA.S CyCU̎B_9 C8LeC% {C5CbÂDn'G.HNHcDMyDSDPCrDfD(ZDY2E(DDDkrDCL%D2#D KhCyI9a@IVHk@H²C?DE:6#DʼnDDnD8;DwC{C1C80ÿGFPH@H8B6bCpBQCFCD~ND*sDF"@HEH=CÿDDnGDD buD3D=DޅErEE DD.DoD*‹wC8CuD!CC}CDPA 4CytBGC+B,DPcÚ)GAGzGoCBC6L3ÉQ.B3C*Sc *D=mCYC%_Cer`Th@T_U@Gi~GMGfG¨BG`C D DDD)C@B>BLBSBbw-@!“LnBFdB@C8 +E±ÇbBA2GwHOHCfI{D@DD?E vE%E2EEIEe'DDX2C6C wCC9GHH]HwDD E!E-ZDDJD_}CD0!4CACB*{`CKBCFN;CCCeCAiH@IbpIDWDLDY DjRkDօDLDFqFnE=E5DD3D- +xDӿ@HJHWI*0Ic$C=D\+RD$G<̓FFFME{E$E(DtDtLC9,@DbDnD0(ND"$D3ΏD( RC*CҦrDDH^I@IcCClAD)}D% +DEE*zdDэDCDk>DDA_ DªImHIC!I)IL]DDxD4EDJD]DxCnC'X@CCf2CnD +C;p>D/ +éCOBL@4~FHHVD,bzD+[DXwDD{D03D܈DE3SEO%DDDgDD.YByCz(dCAHA`IGH(oHi_kDUDQVD:E0DDwD+D4?D, Cq CԏBaOCCÀC=C"ˆÖ{\,Bx' DHe@H)H" cBiBżB{}AY˜C%CCF CvO8BXÏگ,|LC1HqH (H-VH# +ªtC=jkC3RDkCTC(pAIIDGDDCs_C˲G3GaHI gDc3D DpvDtFDqLD7D4CCQaDaDBqCW_C{E=CآCwC\C_CIB=C {C=CAGG`GmCDbGD&7C=CɕAC½|CCpC¹BI`BdGC*A&Y`AGGԀGGVG_›x[CytEҥÉBbCZnUB;Ä1 +BßC\C C;@Cf‡\ ƒBHoHFa@H9DDTs?D4}D%^DNWD"DED˔D|DDD/D4CfDgGDHyH~H|HDmZ|DDVcE5DDbCED7C@HC_2HCStB@D +9sԕűNLRCBPjCmGrhINw Ic6Cɗ=tC.D^`D!C$D#G0F)FZE1:RDD8D7CEGCCgIM@I L7I5ICC5CSEi'GXjGDqFΌ-F EnE@EQVDk"TD,dD7DG^eCgACBA[țC +BHzI;pIUǀC)DC$ CD#DnhE:HJGo6G,F EvED~DBJI0рI8FIm I(DQDG8!DBE߅0HzH  +G+FeFFlEޣ^E>]E4EDߥDD]puD4B˅CC/è8+HwG0H1D YCAD,CADaC_D YEHDyD#DODǵD;fB B$jDH7HaLGH!C>DGDpD*NDTD +PC6C4?D*RnBtByC6"YžCDBRBVQõwB@ +G< I +IxDVCDX]D,@DcD +DXDD0DC)DICnFCǗB\CsI(IuI"I34DD4D[DRDDCD/QCDC?fC`AICe@SBC*Br@BvCwVDCzGiIyIҹDD\DtDE+FE/EmElE2gE*D>DmDmD!D*MCDIJ6oIlPICDDNvEJE`D֥DGDi +ChC CWeD$eCCo2xCACB\CeCEZ¸i;Hc@GGCBD C4YCBgDKDDD1DC&CMCCBRGQ +G: kGGٙ)CY1CirDPCDCOCpB=HCNBE4ZBH$BKC7_B[B;CLqeC2o°`B;C{b C3iHH.@HCQqC9WuFBCCl5.DkDuD`TBhpCxB{!CJY49KGoGYE]H (H C3mPC!tBEgE)DD%CC{@B-JC\Bc|B..C'B?BUo\BK6BW9C BNH1IW`IrD-H2DI D`yDD3CE9~H')GGQF76E;E<ZDDpD-MII)iIQ4If DVB ACJQZCOCyB[1~WFQ EKCK}C_H +@GMG;0B |Cq5D~)CCC:CDƈD+AD8FC~ٙ='D8C޻Û'BqHG7GGGaCâWvBE]DDwpBOhC,nGyC-CRw[{CCD +Bo\C*yBRB0GhH%H)DD7MkD&ND:]D6fDyDtiE++DVDݶDTDHD *CCn +IcPI2&H>`H C[D-`E D`D@CĕCMCUBACBԾC$C!CC;#;CIp·CB³ pG=6I VIbC⪊C߻D)Ch ChDG;D6G0&FFWDEWDMDŖDHC5,CI.`IRHBI>zD`HCdE =GsGEF֑eFh{EtE E +Dm,D;DATDWBgrC9[C-CC|Cn+-C_5C?GlHTH:C{D0CL߳C9DmDYDEj>DKD(YC_CC6BP:C@D2H I~HH5CCDS[D$D(MCrjFUCgJB @jCʔ[HC66BCvÍ~=D՜Y{A%!HIIwIATDD\qCDApD@ǭD=pDDD۶DDD(D-DCCtC5II#IpIDzD[D<Dk/>C%Qgó{DwC֠C_C-Õ9B[OC?CwC(~B<6=C-B9H;GGCFCFDDC3VD*,DaDI@DDrDE"DKhA~4CiC%C/B玷GhGG̀GC}D!DuD]DGeDlDWB&dDCk APC CBATBC0C=BwB`ÌFCx_kC8H|E@H5@H@]rBtC3C(ACC `R8hH H}H5,Џz?BUR>CpCuCĐDؚDIDB mCw~C-+DABPkA.GGUwHmHocC]E,|^D RD+D CDC6үl&zC/@>RCÁ8?R0"C4"Aɝ3GpI2JIJD#D-:CkD0rmD=Dy,ESHiG_G^F[E;]EEnDDBATIghInI$FI:D+DY9FKUI'5HtZH0\G{(8G FIFoEl!EJEJEI q­PöCmCVC=FQyÙhC@;H\HSHVCDNDRCeD#GD:Dd*D:Dj_ODOD"C,+C 3CWCCOGCGH!Hs"lCDD_D?D|eD C!C/ DSCB{C/„;-ºYCS4/CRJC'RL B(XaBCHg!"GIIIs]0D=.DLD4DzD=D%E[HeG*TGSYFuEOEID隻DJDpII8I3;IWDLD+F;IHXHGf2F&=FFEEENEAK,E-CWA(C>(C<Å£9; <ÂSCGsGvGovC;ÄJ.C_C +CmCUD(DDK$DcCC82VC/PC>CGP>GH.Gj9G^\C%_X wBnDCM4CنB{;BCRC8CtԏBBTCjC@4&B< ƅBaHJI<`PIXC}BD/ڲC8DBDj^Eu(jH~mGnHGFEVEE8?D[VCcIw +0ICI_I7 D}DOF9I5HHzGgFEF2FHE2EC>EPsEDDnyD\iCxFSC1CtCC@nH@H`HDxD0oDMDB2Do.Doe]DqEDDDqD\CBLD#DFB0mIPI*FHHן>D$5CoDd)DDҢDZHD%CB.@QCBZCYCDh uۉCCBPjïןHvFFC$y$CWQCG{;gCE DW(CeUEyC7M” ܫkBC)GGGB@FF|RCk֤7CY]DsDqj[CCM9Bӝn*۲q¾^?\~PyB(¸hB$6C.*=C¡+KC GwIJD9DBgDoD$DԫDE5FF/'rF tE4qfDDPCǏD+DI;&I]IhJ}D0yD{E1Ga\F߃Fz(>E%E_EBWDTDMD9*CDf C%C$Ca7D)^)Ct'CX D rC0GvH7HDI oDBBVDD gDDE'E MDڼE ̒DtDGCD#CDBnI=IPHH.-DXܕDQ*D̹bDlSDDD =C{DN8A`B:A(3BCCC6B0BCXqXŸpCm2QF|H.PHN`DDxCPPD#+PCDV +DIDDoDήDfDCD6KBюC3CC VH囀I!H45HV3Di#D@^D\D D`D9CChDC$D 3Dw*Cu.d-CC,\xCX+FHXHTwCrсCWRC駁C=ICuCa+vCtDCD,CkB*HTHJHVGHR6Cj^@гDE2:DDzK3C[B?CBy00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_ND050_02.fcs b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_ND050_02.fcs new file mode 100644 index 0000000..a5243d0 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts3L_AB_02_ND050_02.fcs @@ -0,0 +1,69 @@ +FCS3.0 58 18364 18365 36364 0 0#$BEGINANALYSIS#0#$BEGINDATA#18365#$BEGINSTEXT#0#$BTIM#13:54:19.09#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#R0026#$DATATYPE#F#$DATE#25-Jul-2025#$ENDANALYSIS#0#$ENDDATA#36364#$ENDSTEXT#0#$ETIM#13:54:47.58#$FIL#CellCounts3L_AB_02-ND050-02.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#V7-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#449#$P11B#32#$P11E#0,0#$P11N#V8-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#807#$P12B#32#$P12E#0,0#$P12N#V9-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#652#$P13B#32#$P13E#0,0#$P13N#V10-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#512#$P14B#32#$P14E#0,0#$P14N#V11-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#399#$P15B#32#$P15E#0,0#$P15N#V12-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#344#$P16B#32#$P16E#0,0#$P16N#V13-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#352#$P17B#32#$P17E#0,0#$P17N#V14-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#549#$P18B#32#$P18E#0,0#$P18N#V15-A#$P18R#4194304#$P18TYPE#Raw_Fluorescence#$P18V#637#$P19B#32#$P19E#0,0#$P19N#V16-A#$P19R#4194304#$P19TYPE#Raw_Fluorescence#$P19V#562#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#285071#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#FSC-H#$P20R#4194304#$P20TYPE#Forward_Scatter#$P20V#49#$P21B#32#$P21E#0,0#$P21N#FSC-A#$P21R#4194304#$P21TYPE#Forward_Scatter#$P21V#49#$P22B#32#$P22E#0,0#$P22N#SSC-B-H#$P22R#4194304#$P22TYPE#Side_Scatter#$P22V#339#$P23B#32#$P23E#0,0#$P23N#SSC-B-A#$P23R#4194304#$P23TYPE#Side_Scatter#$P23V#339#$P24B#32#$P24E#0,0#$P24N#B1-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#682#$P25B#32#$P25E#0,0#$P25N#B2-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#400#$P26B#32#$P26E#0,0#$P26N#B3-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#421#$P27B#32#$P27E#0,0#$P27N#B4-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#406#$P28B#32#$P28E#0,0#$P28N#B5-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#343#$P29B#32#$P29E#0,0#$P29N#B6-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#249#$P2B#32#$P2E#0,0#$P2N#SSC-H#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#730#$P30B#32#$P30E#0,0#$P30N#B7-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#457#$P31B#32#$P31E#0,0#$P31N#B8-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#392#$P32B#32#$P32E#0,0#$P32N#B9-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#516#$P33B#32#$P33E#0,0#$P33N#B10-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#385#$P34B#32#$P34E#0,0#$P34N#B11-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#299#$P35B#32#$P35E#0,0#$P35N#B12-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#422#$P36B#32#$P36E#0,0#$P36N#B13-A#$P36R#4194304#$P36TYPE#Raw_Fluorescence#$P36V#490#$P37B#32#$P37E#0,0#$P37N#B14-A#$P37R#4194304#$P37TYPE#Raw_Fluorescence#$P37V#586#$P38B#32#$P38E#0,0#$P38N#R1-A#$P38R#4194304#$P38TYPE#Raw_Fluorescence#$P38V#230#$P39B#32#$P39E#0,0#$P39N#R2-A#$P39R#4194304#$P39TYPE#Raw_Fluorescence#$P39V#294#$P3B#32#$P3E#0,0#$P3N#SSC-A#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#730#$P40B#32#$P40E#0,0#$P40N#R3-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#372#$P41B#32#$P41E#0,0#$P41N#R4-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#348#$P42B#32#$P42E#0,0#$P42N#R5-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#352#$P43B#32#$P43E#0,0#$P43N#R6-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#364#$P44B#32#$P44E#0,0#$P44N#R7-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#851#$P45B#32#$P45E#0,0#$P45N#R8-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#418#$P4B#32#$P4E#0,0#$P4N#V1-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#370#$P5B#32#$P5E#0,0#$P5N#V2-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#384#$P6B#32#$P6E#0,0#$P6N#V3-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#487#$P7B#32#$P7E#0,0#$P7N#V4-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#295#$P8B#32#$P8E#0,0#$P8N#V5-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#381#$P9B#32#$P9E#0,0#$P9N#V6-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#335#$PAR#45#$PROJ#CellCounts3L_AB_02#$SPILLOVER#38,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.61#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts3L_AB_02-ND050-02.fcs#FSC ASF#1.1#GROUPNAME#ND050#GUID#CellCounts3L_AB_02-ND050-02.fcs#LASER1ASF#1.03#LASER1DELAY#-27.925#LASER1NAME#Violet#LASER2ASF#1.09#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#27.55#LASER3NAME#Red#ORIGINALGUID#341265b1-fc61-449c-b286-3e2cd0945538#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LIN#P21DISPLAY#LIN#P22DISPLAY#LIN#P23DISPLAY#LIN#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P4DISPLAY#LOG#P5DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#02#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#2#HIILA C̙D/D @C]CNDVFF^F)ECDAD7D5C`EC3]H@sHDH HƠCDbG?GFU*EcIEeE[DD!IDbCG&CJ-DKD2DCpCf/CMKHC}VrHhSIUpI4ýCJD5DC_D()D#QDE}:DbDLCD3CN+ B~qfCCڎHH7H`IBHC:D/HEi"ER(DD{uD1D7”OA]C iCQTMB^COD7VCHC`貽C˃DgĿ H:dH RH?C(C{‚͖B'qC¶D9CJCJBGBյB A\nGـG4G6GBFª +C]DFD,CMBBvBbA+fCOãC.rB_4AC`E%Bk[0Bs8ÏBcDH@IMI ҭDDM;fD C3RCfCICs9DDDCCwCBbFW$F"EEQDD-A BCmC^[6j2AͯC7QCTCLCשBo>2HG7G#BCC*KCcB\BHBŊD4@D.CHB]¤'BH - C-GG̪GGIBABBDDdD-ךD ;C,CG¹ÐCG |AjCV2BH®ûHG@G܀G:B?'BœAoZ]Be,BXFCDe!QCa]D CCB–T_CDCgG+GG݀GfCBZŒURC/4D`DFC +BC{C`BC[CYxCC!|C iKA_AYB\%A6TH:@I3I]UD|[E^DwDTDڃLDwE[zHDFH9VH*JF/FbcFE"FH+H GFEFEE=D¡D~ ILItI I"DZXD`FF\I-|HH8GGG+F{fCExAQ 57CCb%H @HH +zHF!CBEDyD*Dl6A +CgcpB!fBDQC#ñDBBA@~B{BI^mBwCXFNII$DiCD DD9D +LD>NE̳ZH'HFjHFF:&EtEpDDu, +III `I*VDU](DtFpIsH$tHNGJGN,G,&FwFEvE/EP\COB}AȗCC%wCCC1FHȀINCPCD9D/DQpDGEHaH(G=PF%F?&EJEGŃE#>3DpII%I I D$D-FwIMH wHX[PG AG,CG3FENEfEEm8CÄBCCn7CUC1B"}HLH +HC`C"l_;nC7CbfC4@wBDHF#CWCC /Bv*ċCmI­bHGCHvH B_C4`D(D̵ DZCVCCBdC_ CQZUAÕ_#Cd:Ƌ Cp@RtC2g0CHH~H6QC㩑BCC]CDѺfDYiD@Hn?C*`9_dDQC>HH;SG﵀H +uC:oBߓ+CR ELD/Dd]CiCC;A4QÈGO6{<.C`]S†k./kCczCCnBG +BHHF@H$ChC.wAAlB/D/C՚D%EPEIlE@CCDC/CC2DQ6G G0HH#)C7(fbC¢F\pTE`Ec,DD DaBCC a D`B89Óó$By>TEGGG%BA!LBQUC,A8C3KlC@`G~ JC-CBAeCSCg>!GLLGI(GLGaxWECivD نCUzCl^XPB&B{"hi?E6C3BA Vv?‘c`N5DytC^HDI0ID2nD.CD3]DDSEHHGFFiE\`E?eDCDI5pIkH I QDKfD]FvI@HHK*GYG"9G +zKF{E(E0ERE~ANCCa6˜\ASDMCCCn)Lc=BE+C+]ƅHr@HCHrCtTgACa*D8 C4@CBsD P;[BCGdB!6C3ACD}|H9@H1f\H H|nžVABKCCGCUÆ COXCBd }C%CCw5ILiA¤CNC}B GIMIDI%DeD*FD|EiE + E]HxH>GԭFEnF E$ME@gE4DܼIxI%I=IlD7 QDY Fq˽IEaHÚHPGoG+G0FОECEEvE{{B_D36ÛkC!1CC(z GXJ)"XJRDܭE}E2E#ذE)E*EGG xFlE˄E@*D1D^DDFŻIDIU=]JWhJ0pD9DRE ZH(ɹGlG3њFvFFEw*QD;DƢDH4D + CUD'2DDC\D(*BD#AHmIPI2EDRD&=D7DņDD9EHH +GFYF:EEBEEDzvIIII*piDHD=Fn+I7[HHBYG?zGGFhEGEEGe}EYYeCb BC?CkC8CCrHw@H\H'QCk@D,"B&DG=D=D'FāFCxCnaCY# +Br CwD;ۘwDCtš)CC*8BfGGqyGGC84VA#2DmSC$*CCTe@Ax'C?JC}B;4CqC_~YCmB1,CF;C +bCKBšCH:@Ir0IblDzDVDDﲮD.E[E͠HWH:HBFߘF1LJE]|EsE:=DIHIrIR0I~ +D0Dy_FlIsH HHGb_GKG8BZFF +ExEiEhrtCeCsCAgCG= +G*G[C52ƒINB_WÎ +C +CCmD/3C DZ`=BlCpC[ HXH HC:4CCB69C;=A6CJEbDDL)CQ&CCAsr֌&b H`Hy]H]8Hc0B@v@pgB1EtEDD=D[#C?ÕnBnR0КChiBCAl+y[COBm,CPCCwOGНGGsAArf*Br{C<B%C@=<EO4D5DgC^Cm^C8G^CLJqC wAkqGG~GgGzCg?BڮC{E E_ED".DDCC(T\@ARAPCACBpX.eEGMH@@HGCWAѿWA)„MBwBD7QDDC[Cɯ82CnAߋCtNG'GGqG,r.ä;DLDC[sC1.CCJ_ZC+2EC[;B. +m f p>7zC E;6F~I5 I6C$D?nDD2ZDDE5HYVHGړF0FtEHbEeE?EIrIgIxI3D8EmSFtIJ!cH +HSRG%G-Z[G^F=EEE=Ea%B B+'wPCduB C3,)G I IC~C+DDDDV4EԑHHaGF.FE‹E_EihDI II +I GADƏDs FIVHҐ@HbGG7 GF]EoE_EʖEFCBC(CG3CiCCO1Hq#HH5.fCNՒCCoCDNC=CC/A#ۣCnlfB&C#>XH5HHm@H=?5CYiB&\ChC7CunC W +CBÇTRGaC~CBB!@LC7<=Å[BwsC,C@FC\ߥCKCBC.-CD6D3D\CLBRB B/7CC~HkHi׈Hy3HBz@AnC/*lCC3xGc4{BI!3CC +bhHrрI.xI.DDzD(D$D=D\FnIH H@dG ZFcF#%EvEy`DI*Iԥ@II8E T*EFiI+BI:RHH GGJVF$FVHFF1EWCgIùC;\{BcD6BEGKHHC=C2b0R#CB~I,CY¾ CÆ,\B%9Hu6@HpH`HdcѰB4ÂȕC~ACdCDXC2B*YBC67ÄCIBEBӗLtC c"'οБ!CGU{GI֍J 8D`EE EeEEQ FUH#HOGKbFFE0EV;EFrD.IJIIiD;DF{ԙI9wH7HBGbG GGFEvEwEleEr{ETE3EgESEb/D EDtGUJJFa2GGpG H+sHHkHw`H0H*GG#GG4FiFAI)JJ@jlJG:oGnG]rHJbHGSGVG GE,FKFNFF?FFLPEFF +#EVEDE0EEA9HVI`IUD +E#ZEjE<]E\EVF)HPHcH#k9GFcd F +EEl+DPIŷxI;I I2EDrqFI;$IKTHGǕG`ԕGAFy +EFEhqEEEwEoRqE3EAٴD.D#DGIBIbE+Dj/D8DVDPD pDE*Hؾ/H?bHH +$F[PF?EBE#E;DzIIII/`IFTD"DJFTIy}H~H G+G\`GBxF$FVwEEǗEϲAwCeCLQG=CodC)BCCFI4IDICDGD`sDęD2E|H?WHGF8F]EED5aDߛDKI;IHlID?DgFtuIDȪHHOGG'G>FEַE)EEhCK D !)A4.CCV%CH6I5I+jD#D|nDMDDDqEHsH%sG FpFqEʑEuEGD%9IpIPI"I<,!DI}DFIRtHH]GTG,CG1FCE]EqE7Ea.B΢>B?~CCCA0 bHeI=IWsDoǮCJ.DX3D{D)DCTEƠHҧH8HFBF2EvQEnEbeDmI II&JI;9DpDFI{HHBJG;GWbG=FFLEE!Er"B/8c% {åCDiClG.GҭGGaBBCΟ?BoBABbCx\@bBS?qCNlwGRG~`GýGTÔFB CD|C<9 CUkC%drBIgWY*ACrP@.igAuB#ÓwUCGIH\sHSXABCæCg C4C JB :DJD{C?B^!AA> kCuGG0HTHyAp]BCEEOD:D' +ClKDNC܅ARCBۭ5`gÖߚBy#zl>8Cv#BNY(h;CeCGӀH7 HCH5Bu/C;DB(C'}CJA@Bl"tCDslBveUC#C/ClWHHzWH`H@AEC-qC\DnD…ÆB.XÿԀ8IB _CsCš[2#O\*eYB,AH2GG#B5ϋC®CN@€C%CC''VC^MsÉCC/GHGEG[GC®&r9HDC˯hCAߌJcB^{B}jCE^ĆM@B~C$?Ëřw +CKqBC&GwHD@I;DT>C̢DPDDDEQH%G G&FTEJkEvEEW6EaC!Ll{QaCќ)C0QAϬGnHH&+TBwDA +CC=GBAfjzCCAOFkCXCtC;B} Anl 5GGAGC@BzdB''C]Cc:D3CD{CBBQ}.qBٻCG]G}TGG;Wº2BRDL0DSCβ"*,QSVübK-C\bCA^A`¬OҀC2TCC?Ht@IrhIDDEE=EjCu"-_¡B۸H`H-H.@HSCvoCZ<@yVgCQ7C{ICBi¤W09,CCC^H1BCDC]CJ+CA籲C G +IJ@`IvzDDBDDE!DFLI Hy1FE[Eo'C|/B iOUmBÅmC +pGI5nPIElCCpBDDCufD'E?Ht"GРGŖFqEޙEuE=EDI"III"8uDODF4_I!XH3H GYFreF|4FGEZEm|E/E2jDPDD=CĤCCDCO*Da1HIz@I)DDśE,EkEpDHEH1kG_G]aiF2E~EM0DDzqBD}I(J {IRIDbD_FxH@HTĥGyG% NF"FF2EjEMUEE j\wC%so\CKv"CPKUCKBGπHрICłD{:AD D8DD?fD'DGF42FG wE4rkD ^C$C$Cc BIpIH#ID#gCS6DG}G(aFEEErD3D"C&C/D<\Cp=/'Q LaCN{*CG7G^GCfrAޱBtwfCwCB{#gD SC(cCBI8CVZiLABS#G{GcQGqhGkC@CrC^xEUMDwuD;'C5yCC,A5|B5QIBO:NjC6@{ŠBl~?tCHHCUIB_HuʀGùG.BmCR CNC73C/C>TD`DD`D%mCBCmAPxCޖGG~GG{}#mg >D}eDtCCBB=שC[*]pX^ilÇCy#CHCJA5CgvAHGGFB6!CCGƒkC3YNC;DcCC6A4 /p>€}*%.zGq^GcGmGgC)XCHD&iD)CC½CXC]B8>ž1AYC +R®@­yhl #S ^)B*m¡? B=GcI>`J"DF\E4t9E:֔ECDŽE^+E_F$~uHdHHXHFFFF ,EBEEv7D I*J I&`JDEF9IIFHGn'Gi'0GJ%HF5F#EvEVEO9EkE= +EfkEEHE +!;DGD+vCFIHH*H2BS6z?BX7A6CmpCLC4 EF!DߤKD5C)C9CCeMCdA(8GGH4H5k C‹P0TC-F;EEoDXD ޭD:Cw$B +Ye,{%BMØòQC}wCU@}u+H~܀IАIOAD;KDIDD E+v{EEESHH/dGrmF&WFR_EgE1fE#[D?LIhII I0DZDUFjE*IDHHQ}G + G&E=G̲FxE EֶE,E`C.bC+GCh\g{D&@!JHlI IT-DiCCZZDGO8G:fF:FEJE9nEDnC݉D63C*mCC CAFfCLAXA:BGIXJDE E5EEEI)E]FIHpH+ GFpHFE>ELDL I(IIxIjD](E5SFLoII"Y9HGZGLGr+%F dFELF"3E3H4GuFOFB#EfEUE'D>zMIXInIXIul?DMiDFeoI?HHJG4GAG]FuCENEE EYCo?D:rC$Ck&I4*BBḠI1pJ +ֱDSEU`qEcjE=E EzF/jHܡHCr(H 'F FKFE/pE?DI`J +]IIE*EF&I"EIVWHdDGGdiGE;I ?0I¹DPDB>1D1D3DuDEݏH̞H3HF-F#E%Ey?E \DIPIIIHvDDyuFoImkHH}uGqGM,G-iFFhE׌E E,(CĎCyvC!BpcCo]C.GyI JjD*D E1EF Es0JE-E9H>HmWG F/)FXEE@ESD{ IpJ IvIM#IjIDDFIWIH4GG~gGnt=FρF5FE/EC:C©CBaxC +ƮGI*{É)+lCC-~DDC˛7A<%,h Cn>GЀGEG,GBlC|߬AdgE6,EyDRD0gC73DÒ2ACNSBjB Cde[V<)rCb}J†B7"HPRI-I=mzC)BCoCsaDDFE*HjGbGHdG(G8GBFCEjEBEEz5Ή@-+C 3CCeBjDb¥HH_`HCD_ EtDDDD]F]EEDDCuCʣCkqCrH`H CHu@H} C;BDUU]Gz2F +F'%EiTD•D0DjDC XDCjCMCZ}&CCC.O@Co8wCIoH]G瓀G0B=9BjÊ2C"COCJ3DD D-CmAĪn51BtGGGGqC4Au@EF0DDQBɚD 4@#BCja¤! +MC7 {B¡_CaGBV-HvGSGIxCAbE9aDFwYIH~H6LGFr3FGE-E8DQhI@ IlI|pIۏEN.EF̀I2I%HG]G@GFFGzFEͪNEmCXC]CICÚC~b×}u+GH9H7"nBAìD +# DB@WsC Y7;„jBۆBB$1iH8HdHjHC ,(1CYBRdrÊ?CZC3 !xCp6ëC@Q>B8A@ݰC\C/{³U9DJ+TqGGGb/PCq|BhGB(gC{u(D^/DO.Db4@i=C.GCq ÇBLGo>Ge +GGnACsUC1EDDMD)BC݊Y\[o/OCc¤,AIuEE=C-@!T6cC'BpX`GIHIjEF +FrFT)FuFFDTDDnEDVDeE-DDʏDIDN DDR!GϏHHLkHzDZDD?D)DJDPDnD]{DVC/DNUC^;CbCÝuD CYC2@C|3ñC6H @BXCPCHD D(s DdSEZEE;ET:DD^DƳDADDb[H!}HDm8E;XE3gEE/E1EEYEGE0EhGEFEQAE+WE.bEgYE(Ij(IsHuCHȨdEFj"E=SExkEeEPEE`EXEFE- DtD-DE>DeGD$@dDDzLDmDDD=DGtG ,ßÝC`CKIpfkGvG>DED;E9 +ESDɵDDDLD_zDDW&DOND:C.C(XCCC*AFDoæj"H"C9C%CRMBvCnCw+D$/C!GD;D]p CCCBxAKCtGzGuC:C`DD DȮRDh1EnE>DcPE$m)D^cD^DwDE6hEDXDl!Di>DK9CDb:CC5DsDCCP(CWCDșEçkC}fC6C=c[DDD3{D~CgCNC}[Ù¹D BHHlDhbDE*;D^DRDDNE\D*DDq-CeC~DcDP +{Cc!H HHHDqCCEeED>DfDZ6D;CIy*DC} +CUC>C(FD"D*D2 BC[CqD #GQGhCNstRCٶCjCD 2gD ^D?CÏqÁ C$ʿCB=CN;G¦G0hUCD D^EC)CN +D 1DeCI}B;C.CnD{C-CbITCRCUB +BSG=EGM +D$D D}rHD{DDD D:aD6DD6!CCCm:'ChCjCGNHGKGY٠D%D([D2\C#DiD'qCﺟCEPOLD4Dm(CaD0BcC.Í0C3CÄ'3C +&CNGByDAۃqC֑CfwBCD+)CBBC]D=vC7+BpCzQAB?sGGECڱDdD]Cm~D?DD)ODzEDD7DQC6Cl\CcCHiHwGXGeCDBD.DDD)DJD2aCC>~BzTDRtCDC,(hD jD* zClfD%D8FC@C$\/GCȈDE4EEE|FLItF#9FJ\GF/"E:hD}DS-DLE3D;CߝIJ%E}F>EFdF_FSFͰF'G|G*ʄG nF0E[r-E28D5D D5IHIrIvHISE(EƺFHyǟGGFPFj.wFGxEלECHEJDDjDGDDSD;3DB]D3CH6@C\K>CBo=SD +DdDuEDͪDMD/CwD4PD9ƹD#H"^HYwDqD=DfEϜEfEk*lEE[EcEE"'EDE [DΕDɆMD˟wDUI25It*HXHfDDKXEB}ERETE$EHEEDDD8|D}DDCCD24DzD'I;xDD"TGr ~q?'SC'oBBLC-%_CBCJCϞB>BǷ.BY8"D/G} GFrYòC ‡aC|C-XDND2D*]qiBlC(ײÈ +<»zGrG5GG$sBBBqCJC{E3D:D2ACA]C +2bOCgRIB v^ÃCnfB5F~AFaGCPE>B~GCXB0dCE!'C)AyWC0+C $7CH H hBCDq`D] BDIX"DXiD2iDEDD2BWCOC D#èBRBtC30CÔwBNÐ`B{Ca-".ŒGAC7btBg~BbA\ B(”۹@%l%@!nCfA¥AָC;CG2+GfG4CDDZ;CqfDƸCD$BiDN"[Ay CF2xAGDGZG7GQyxC VmCLCSBIBÕ1ÉJYB|(AӨCDCBmCvwC@B+3BB[QCND(CFvBQCYC*WCADDmMDYjCpCDD.OC>B{$l/GaG7CCD{;Dv 1DbyDaDDDFDOE,=DѼ9DKDL2CCC.HLw@HɚGb GCiY.D DD(DADDDͽC9DxCD3D-Cݐ=C C{GɀCC}CDaKDUEEBE&GF{F8EE$D[DYCƬDE_°ѷI8ITtDDnEE6EX[D2DEuȍHk GY!G)I!FEcESDݶDCѾI I5=IIFD1ID7"E HqHuGrFGFIFaE(SEptEThD Eء +}4C7QCg:3xèLA-h'FDGCB(C,B3CqDD`DD8D^[CθkCӔ CCCi7C GGXC DaD#DAEAE<E}kEg(E\4BEr@(E[1DDDRDjbDp@\D-H]IGGDȮDE=E'EDDGC˭D4CժC^C/DDgC0DC`"QCC$8@GB'CyC-C-Ok3A +=/{C/BxCšVCQ' CU&eCd )GGێC,D5aKCװRCJC/DM_xD2C +CCCC$GOG̀GGGB̓+CoS3D{B/BGLBwC½NXB!bCD#C.CG/y@Cs¯~1Hn@DoCfTC.CmD~D;DE"hGx{FpE^mDDD> MCCwD_S`II?DcDID-3DjED8MEHL(GGYFv!EƖEi2|EYD͕hD IInmPI5HָID@DF,jJHHnffH GCYFF+F7&EEE7E4]C%@ZMuCZÖń—.C-CkHeCyD` A'0[C?CMCiC5 +D~C)=2B A^,@h+C1?AH1w@HqD%RiBDCCECDž?`CHpD DGBZCɉ0—"à&) %BC)ikH5-HL{H(rHaէC%@B:E4>DDJmCԄCyDCwCC/CKFCAwA=1T%o/bH+È8C{C1hBZ/D3cpDE TDDE O`D:DCmvD8D2C,3HB@HDEE:REEvEEUEE͛E|cE43E›E\ӍEyDD⧥DmHICHCĀH)EuDEkGE~DE]E9`E81EK?E-JDՏtDPpWD%ytD-wDD(CPCfDPDJ#CnQLC-DHPz@CF@]C1CMAۙC9CC(BDžCBB 2i:BH*qH=C[6eCCeD D! CDwvDDcBtB}&B CCCmH[Hz*H6@H +GÑ[t{QDCx1wCqD0C7B$CEFC1fCDCM}WC|B4BBCjCCԹHBB1-ƒ_:BZbb‹ BnyAΥCCa[OBe9gàYae FvFCU-|:( +CIBYT@LD)_BZBI|CS|CBwЊ@!B]GjaGcHFjF€B4)o@CD9KCJBXAd\a¾Ë% CtBj]7bAPYYCjC>*{CiJH1(?1C +C5CD!3DYDYYDDu3D^DDKD`D)D{D}$4Dy0 D^xPBCCHHGqGD0jB}D=D!CnD*]C +D >DEyDQD C<0ACÛ'B)CC$vD dyB>UC/D bH/COkC,CCDV|D]DELRE# +G>SF6D(DsD6C1>C>]C+I+jIc^E?pFTFFbFЂEEtHsFHjH6gGcG^/FYFHF!EWwEljEDG>ä"A CDV^BCfBHY @CnI{CAECsCrD4\)52CaC¾˖AjC,C?WxB +?9pyv^(7Bח$Hr1CA=B+LCD5yCrCDgDRD:DpGDZD\CpGCCv=Cy[GVHCXDwDDD_CDXD-CwCuH5 HAH3@HDGD2&bDDS<H^ـHG GD<>D|DpD;D]CD0ID/ D+C sC}C{È @_7$B]Bv|C|zDCD< +EB*MO%âĞB+B%CtCrCGBDCCY-CAB>f]C3aIGGGC*D_͇CD奔{B_C]D,DDF|CRB:|DAvBw"C G}G΋G~G|CCXD{ÊCJD4KC=d1DќÑOCBC>BN/l6{;ÅfCㆎ^M´(C=H:B|CC8BYCDFG/DDVEDrbDcAD/\C2CjDCNH`H@DV{DqkE4Dl}E9Ed8EzEEwSEylE"bED_-Dp\DDyD PMI+=I|jH@HLD,EOEcEDUE-hE DڟD,DCCSC,CCCDdCC DN3DcCGC^WD,xG̀C=nwA#;UC5Aܙj¦B?BGBAd1@ZRŒyqâ iHGG CӘA{mDMhD0ÒC +CeC5D`CչC0'CQsB'C[--XC + GGGWGTB>C)A=pC#5DQbCCB*%BB˩?Cg<|CCAeoB#3B(C,}CCwFDPC09~C; Q@ՔC9CD{DYGVFTE1\ZD;-DaCSCLCH*@HD}CkDD+CD E4FHGieG=DF*Er,EFD"D(CIx@IޛHdHkzDɳ"CEH$H'G0aG F(FeyF5E}EaDd_D2dUC>CVVKCu_2BC?C@ CH1N@D)DvDDEjEEIFE3FG6F=E4DDm@D>5CAQDkI4I:EESrE(EkEwER[EfH#|GG9GUFNuHE@EOwEʮD\[Du"JTJ7 IɸIL!EqD-HF]HH8@MGӽG9F}FٻF6EEDC[E8E E"E2D9UDDiDFCC@G$CJCBCxC}CNDoKDyDcDmDDuTCԖCsDkCH@H%DfԦD[EE WESxE]E EEquEEBUEmDDDD3LH|HGHHTD6DEKE"EPEȆEQD?ED>DDxM\D{D 8(CCfC<"D(CZH0ƀBÐopeWC&aENE=E+eEDpD DpI! IOHN@HDtDE&E5EaE92 E@ XEE DkDzCN +D?DruuDlCF%D0D"p3D/ +D]D3C~zGØ:B0äCswD)DFW+EM.DEEFDMnDDj{DDDhpH gH[kDDGE!DEEسEL%ElE1E0DE̹EYE%iE=wE'D߁IsIܑHSSHE +4E.LWEE[iE{1EEElEaLC@/@{pBaIGGэ'oCFD[B]C +CDNC^C_]C_Bz<©+C3fC>CGG$GG3dGMٯC%P'C~~D#DqDeٙCp@͝T B_@X )C=CIB-WlCU0CQCMM=õ)YDqG>CvX]C?CBO!CdEBpCrC^CBdA%B('B8GbG¶GD' DWpCkD.$Dk1DlD7D'D*TECC2÷NC wDCUH[H0AGC-Gi^,D6ClZDw\D5 D6CD D`OD&Uo14MA.CNó(C CZB#C$36eC$TH #¯'CkCD3DX Dx2EErDCֲC'&B5}B~C*CBvRBJFBA²NB3ÁC2ž{CɢuG9BΤBqQB?BC[Ϲh)CBO{pCBHjXGLGM*)CZBY3CjC7CQg gB3CAC&=[C*fAwi@3CJGIG]GG9CMGD/cå{V7ABl nA*6CgOB.Cpų8BϨZCABRBVI@6C%FH<Cüf|dCBCCCDCkµC:CQRoNHQQHDkE ENE :ADߔD8D0pDUuDDn$DXCY0THB GVGIH'HR C/DE3CW\E$D^Di Ca 7C>C,bC$ZRBo*t\C#YC")C;[A(OCND%6H CW5BjÈĸA}CNAB(=pACAcB3CO_gBKsGH!BSD"ջD Da=D=C*DDbCqC9A-¾ CAB*w>3G^KGG\0GIC D%0CD#W3CCD +C_HN@CAf?FB/`>CY+CZCqSǣC7C̒UB GqBGGAGGI=@BA#D7CCկC'CC·;C@{r(CsRB679C8SCo_yfǜFGqÉWBC!`BBC,%DC3DD%sC;dDDrACpUC;GڀGhDEE,DE;iDiEsED6BDѿDMD%SMD"6CܥCADdHMI-/GGDmyDV>fD2)E-DCDrjDD[KD;DR:C{D MB D +CC ÏBݤBB½ÅCHWGpuBug¡.¿PD5BCрC|hC8AH+¤хCuO#HGnyGQCDEF6D+?aD_D)DxE+3EaDDKDIJD'MD>kRC(C+8CUЌHb@HdG@Ga D DDA\DvBDXQD\kDyD + +DK!!CDCKCڈhZ&GYBCC\kÓCGHdKC RBі6-CCDj=D)DnQDOCPBRCqGG:D:1KD#D[D&Di)DyDDMD*IEDD~DRDF*Cz0ÂI,pIV>UGG΢CLCD!DuD-D=BD10KDS6DtD2ýMCzCTD/CCb§k7CD&|CgYAGAo dC)CpCtCBU0BpDZfCtAv TCBNsBKA.FGG+6(CC"KD B\@%DADZDD2B7C%CPڈí !EGG<GXtGX\Q-3C_zE\fEjDCyCD´8C9XBۉuBOOCȇC%CABh*b2C1oywC'H֠CNeÀuCY*CZJ\C,B CPS|B-.$šCGGC yBCwXD,C¿D 6DDbjCzDQ0CClCuCMD,D GT6GטGbGZB$!BDxDTC"BEџACSC[MBBB\a|C^BZCZP/Cx2-0Pi?COHD+²xYA@XDCnEVD;UB\DSC*C(P‡zisC H&aG=GJECI@D%D^}D8 +D>yCDMDvPCpC3C UC&CC?C1V_C-G%H jGG..kDA)f3D8|C:ChKpWC{C,C^CNB3D*Cw}铷DVCh3CB3&@MFy˜Z5?CHC=C`ȨBSDCD COCAC:+Lr HH+CϰDj D2D D9.DjDD_8DLbD^DuD:CQCCG0BakLG0H/uHu@H5zC#fC[DjDdD5 +D.D=CyD0B/)D+;NCKBWC8țÓrCdsBRə±ED=DDEhMEzD7qD$j2AӬCpC CI.IGILI)×DEpEEZzEȬG|G FEɉEWaEDD}oD#I_1 IIIWE4DVGPC{TCRC3¾\2k3CïDՒD)DDDDQC0D/CMCH!HI+DiDE1+D,tE|WEKE?EćEo͙E*Eg1E7""DAD}DDI1XPIzH2HW&DYEEEHoE"eEOdEE E.kC+Cƶ+C +Gi'GPGHCS6|l=DE"DDlDPDCxCFs¬ ;"&CCYC>CNLÀj?aE6E0.#EqEQƓE){E^EeEìEY~EݟDDD;+DPHpI_GZHgfD"0E E%e)EHZERmE;wE%7DEפDDD{DOuD2bCCCso@2DC,CpCD N\H*`HB +DvGE >qE@HEEBHH.?CpC"gCBgBp+B߮EsBD^KCqCGwBVhtBzG GD .CӲCwBCs +fC/+CF/RE[[Ec`DB[UCC2~CȈ/B<ƼBGGGG#DCŽDpFFc'Em;E0DDoDJHCC,CC\C-$BC.6CbD=^AaDBMGd‚FrBQCdvC=B_7ҾCh@\?_>Bɩ¾ IC$CC!C^GG.A> SCuA}}CZ{BC DC:D +QC5BFICH!CeύCfZGGG,G;½iCzCREkNCɈBHjBrCLRt2'B\"B:9^BAPHB{KC; +7jrG) ¤C!D +CfDڹDJD2EDvDwC˙CŽ CP rCg+{HjՀH2DMDAAD4DYE:EbaEWEE3Eq|EuDD"!D,/DCHnI 7H4ҀHjDOE!E$QE+@DlDd#DBD]C(D]D!2DVD CuC D#'DDm C*pCoCYbG_ClCiX"B +CGe{B#C"C,QD eCC1BC*RBQCu GG9>D_`Cê9CoG +BACD.wDN4C(Cx9hYC BC +cBRkGGGG_C`AzEP`D(ADwC3&LCBs1C=C=CEABoCmº›3P£'CGxBfA}CM:+CqC lWCA;CfBsBXCZï)N5H_gHk-xdD D$DD.qD|!Dp.D{D$t +D-~CDK!C5 CD3H'@HTH@H!A^CCfD~DD;"B3CCC]O'k*CD/ŠwEÂU3@X3CʷACeZlH`aA8ICkz@ÚCtoD~CCBcCm¶ݹCQFB5B[C.PG1GbBD9CCձYCZY «©GdG~Gj9G|c“,BBkDQzvD >uY>cB~C:BCWBLCKC۫A^Q!v Co@o%*C?Ž/=H`KLCШ^BCrC͓Da4DDEDÛDD.CnDC+A|%HGH MDnUEUYECWjD D$DhDC!CmC'CAC1qGC(GdGCW$DХD%DeDD E=E).D +qEeDuDDCD@Ds/B{XG΀HGGʆ{D2DpDRDɗjD+xDJ+DYACC$D$-DCmBB”y>C> BK CCCMCHSˀ6•5C9g¨^R×s,C;C1UGBjC,APBD@qA[nSCsGGgBMD 5aDMD _DwCuD2CWDrDDD4CJD,2CkffDI`BE`CJDB:<\-@MC;Gm$CoBb+@U+D +6D,nDTD?\DDSD™ D%DTD.)De\~Ñ$HԀHASD$EDNJ EjD*oEE;TE.EL&E7EQ-EHvrEd,oDb`DDrDV+I?I9H5@HqVrDDϷERECE +DãE UEYEJDD+?D>D3DTC-FCCߙD)v*C{CHC WC#BpCcDÏCΚCGB?AE‰`OG Cj ×~GhGfDBjtD4RCGDWBןD-cD5C>CzC )AܧBZ]C-qGD:GG##G: C_CB#CXǻ ˜ ÊC"DQCD @؃BDCCJ>tBk@ff!d[f•Ca00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_03_NY068_03.fcs b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_03_NY068_03.fcs new file mode 100644 index 0000000..e13566f --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_03_NY068_03.fcs @@ -0,0 +1,73 @@ +FCS3.0 58 33310 33311 57710 0 0#$BEGINANALYSIS#0#$BEGINDATA#33311#$BEGINSTEXT#0#$BTIM#14:17:36.01#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#28-Jul-2025#$ENDANALYSIS#0#$ENDDATA#57710#$ENDSTEXT#0#$ETIM#14:18:03.22#$FIL#CellCounts4L_AB_03-NY068-03.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#889#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#478#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#576#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#533#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#687#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#1178#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#905#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1360#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#322#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#322#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#271591#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#372#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#437#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#323#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#228#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#267#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#231#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#317#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#470#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#329#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#371#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#1268#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#273#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#241#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#242#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#325#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#634#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#402#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#55#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#55#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#248#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#248#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#375#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1011#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#484#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#465#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#470#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#458#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#285#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#526#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#426#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#654#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#486#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#871#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#279#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#398#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#694#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#713#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#145#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#230#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#315#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#227#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#185#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#262#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#1312#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#483#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#253#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#803#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#649#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#836#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#638#$PAR#61#$PROJ#CellCounts4L_AB_03#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.62#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_03-NY068-03.fcs#FSC ASF#1.25#GROUPNAME#NY068#GUID#CellCounts4L_AB_03-NY068-03.fcs#LASER1ASF#1.13#LASER1DELAY#-19.725#LASER1NAME#Violet#LASER2ASF#1.16#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.05#LASER3DELAY#20.2#LASER3NAME#Red#LASER4ASF#0.96#LASER4DELAY#40.65#LASER4NAME#UV#ORIGINALGUID#3bf74bcd-db24-453b-bab6-edc64b545378#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#03#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#G6o D DUVCCKDdDpDEpDC3AŽA&eA +!ó/A I@IQoDwDYErDQ7DDJDYFt^ECEDC8DǍCgs#~CWIgIZ$HIIC[D gDG *#FЕF&۠E|DDD*CؓCqC,gD3~^D BCGCCgmmGPGxD"DwE6EGEQF2FݘFMH !G !'F +E^|E"/DDD?IkIEWEEEvEEFBHH%G_FrTF.FEFXEUDIJ I IeEqE4HpFIY`HQHyGcGEw'G&FFElEE FCEE?EwrEmDfEEaD +HikAF3cIê-oCsDD23D)EA%DO04RCv@s CACv¼ Hq@HzC@,+UD6Ԉ'CÇ.kDfFJE`E]QXC BsBOC%GAWB]HH +Hq@HwqBBHHD}CYFuF, EEg,DDD:R(D/ CC'D% @C7CC/AΥD7CC5BCHGBi,}e8C» CaDXDn>D,DCC'nCsLšGC*B#\H`HC!A&CDmDmCU/COEECDDLCGUFEX+D<DC!JCܪXDH) HͯCD2?DBDw +DfDEEHGGGNF^EEyxDDCIIHH/ +D\DJF2^HhHkhbH + WGBSeFIMFFB@OEYEHZECnENGCCU iD CCB%G=By棖RC0C] >Co?CSD( C}C^;CVÀ Bڱ"]{C +HGIG keCBD -CT^C\xCtDCz1CVAJDv/C PCBʽC‰>GdG^GGGl yC "C{EDD0Dk9Cƛj:D$nC,C 8BnBt,qC${CCA3̿ǭk{2Ès)ֹH5@6o C`CihC%C!C ACٙHCCnB$o5CVHB]GGzÀ^'CCGCD7mCۅDCDCBߑADqgCG,CpHlqGGG*KG*kC¡AffDrD&Cr'BlD@:BwuCrLCBݸj$GDChy3C!zI B5N\H6@CuCMDݠCykJD:QDT@E ZERGoFeExܿDDGuD.-D,D6mHHDFkH:7CÃȁCICBRAH[ÝcCC$BWCynBw~AKe3þ3 +CC˿9;0GBD(aC7pDrCYD;EEDEpGBtFrEEҺDoD DbrD2eHI DMD% DyDlDDEe#H GGFEBE]EC:PE]DI8IًH袠IɄD|DӉFdI0H$ HIGGIG jFdExE;E^ECŒB 9CsC +=B[C*BfH,8CU"C?BSBCmP<(C6A A7cÁwhÅBxGKGBBnDC]D°3GC˖CvCB$CTu4oBhCBGCG;G MG i9 CCtDPlDM~WBBC|Clÿ cC +ß!Cf Ö@C)BŇBwb`BQBh]Hs \ WAW@3@CD=QcCBC/,XBՔB֕-֑yBICk;GuAG5jCCCoCH\CCbCCeV9CŒQD-9CFC'yG-GG\GofCRCn#C+,)DN%hB4C@úE{ \CMQCClC{B1jkBGҘC;Bc3[aBA]CGA `ºBX>BbDFD "EE>+G#rF%yDD/DCTwDDCbBII:hnDHDsDDpυDbDF(rEZZGxGNG'F HELxEaDt+D|$C5ICI[H٠ID7Da{E߼H͢H BG0G!F'FıF,\EJEBvDmD+‘RCѫA(C3D܂B>0'GšBXÝBDBY4[DG#ŒJ'jA]CkRC} +C/HVaHQp?CRCCn÷H¯|C;_D[Ù/FIÅJB +BBͯ>HPHH*J@H&z5Jeg½CeBCCjCRAN@CVKLC}ZrºŸ@G/VRZBWCvC +4GC!CBy*CDDgKE_D5ED CCv\}C#C?#]IIFD-%DE0mDhDRDD7EKE $DqD,D Cb+]A1gn4vI&0IIH`I YC-DjnD?JF8}EE^?DD0DCYUC#CCCuLC8WACYRBڗo +!H{CFC Dr@CfD)DuEZ EgRGyQFE2]EGD\D8Cu qHMI#iD,*DBDlD/DDEϱ1H8H zGϢFFE#E=REDT I^IfHH}DDWxFnyI=HHYGG&GF&E')EV{EbEu8µC +C{rC=6CCjFCKDDeDDVERE[\GF7?EDDAD $vD UDRbeH@I)`D0DDiDM77EnkEQ F5bHlyGGG_FEXqEEg͞EE‘EEaE:3E2GE[DD"H4::ChCapCcD.5D.Ey8GɍF3EE4DģgD"CdDGHT@I$DKCWDƍD[E +>xDE HGPG FF(EE,E74D7&IwIƳH{H̓D7D F]IK_H2HhKGG45Gi:F7FgECE~EE{DM"[C[ECw3LJBdC)0@HbCCCCC8DDD/OD$DeAD89FnEx +E4D CD,DeüCHw9HHHKJD0D#FF8E DEDD D4XD!>C{5hCj¤ˆCICIzBl;1 }HlD'6Bw+ADD6DE?E)GfMFeaEMuDKCيDSݑC? +CI-I+DճDInDr9E FDfEUEH6JGmXGorFNBErElEED)qCuIpIHЩI[*D8D@F!CHˑH^qHG8FFF@gEEE8E,ateC]0AÚfQACC|G}°CC +CC2D?xDWE%ExEd˅G:UF.uES=Dc{CDFD"-BvI +`IB2DlpD rD$DxEdEDEbHjGGnGB@F4EEQjEFDDXIOIHM`I0D( UD1EЏHqzH,GG FF}FEoP#EE-3EhDr;Y%CXCFB zA]BtGVDabHkBDU0D~EEG%8ELcF#EGE'sFBEXD8DyCvDVDxIZI EEExED +LEEIzErQH xGeG8!F2wE,E4D DvDJxI_XJ ++IIjDDwFHxzHGRG F8FjEEˠE5LDpuEE+YD̶DDfDDDxDi!C HF!A]wCjC9CsC1/B(DOBοTCB:#CUvCK7CAG~GwCRU,DnD9D 5DDDzDQDmDD$CDCl'CTCm§wTHP@HcG2Ge/CӁCDYDDKoD9aDn CDCWtgCxD<&$CjCUB6CJ DC{=Fd+tB\NR¯[ C]C +CECk1pC!CéCwB}^m%G GOC*S:D3CҘ?BZCM^CHD:CDDCK.%DD!M°rj82HI@HSGGB["]BA|GD9D[D3AD ͪLC&\C!CbBoCu?DC&ÂGC$C1nIhF|CfbBeDJDDEkEzM BDE <3EK=E*EEF H1`GnGzFEFFE"EL UDZDIJ1~I50I{EGE!FI/HQ^HH2QGG"EG FXExEEEZC CBCB2ÕwC0G8D\vBԎDzDLD DsE4Q6EpG]7FxE1sEtDuDiFD:DkI&UpIU~DnUBKDDi@DDEK-HGoG0FEZ(E.EBMD DVIIIYPI,D|DꩋF_I [HKH6+GwG@D|ʘDDDDDyMD@%Dk3D2CBOHC|CLCVGH.G-GD:šD8ָEWDDzgD-DCpLBC[`C~6C 6aCCF`BW3CҮ YnCyGwDD1E(EfEa^FFH^GKF3EiE9mEAKDMD2@IxIREFUEdEEIE}E~FAH?H5HG[FPF E\fEKDBI_J&.IUIVEc7E hCFyII:HTKGډ9GsVGOFTF9M FEŲE E.EENEQYE9DDDN6EXC{@Ĵ#CDž,[CŴjZCźC`ZB좻C7SC\CiCtmGX$GlCSB5&ABC'D-Cͻ^CD=D'CFCewR6C6BC6!BjHbH iG6G=@xsk7dTD"RED$^CCC&\B9A{BD?ÃbAw4CB BVÈqAfBH(CCCޘCPH|QCwcCsCKDzD/E uEAEG}F'[E`EDDD=CIL`I D6aDrDD0D.E /EֵHGDGyF0GEE{_E7DDFIL`I۸I`I E,2E$MFeIcHH2ݶG|oG +skFFxEEDLEqEjb`BJCڸ/%wBDZA|H.׀C|BDXDU`DBWE (EtEH?GkEuEEQDD̵`DnDxI=Iqz-DHD!DـDSDDFΨHsH%_HFS1F3EpE+E:D IhJsI<`IlEsE2FIoQH{JHGGTطG6#FjF$\ECE-EpC"AC=JB%` 2C!DBG1BmDC?WDD]D'EydyEc\GSFQ3E8sLD8CÉD1UeCCajIpI1CDc*DD+EVDDLEwHGGwVGIBvF1E}E(D:DbD+WIvޠIpI +`I( gDDFHֱHL\G G2sFNOFSF,E>EpЌE`EO£Úiҁ#3C-C`*œBGºC y{CޞDDYDʴE;EX)GFŞE'EҮENE$EEtF[vH!H"WH8SFɎF@1F5EE?D{IŋJ@~IIےEk@Ew%FbIqpDH>H?bGɢGV7G<3&FF%zELELE?EE-EEV 3EPDRDN?DGaB7CC zD.kDzDE"EE(RGLFfEDbDD]D#)D (%HKID}DoDrDeDDEHGܖGF:E'E EHE)A;DI_IIIEE-F\<I(HtH:G\GalGspFmEE%EEzCCLSMo1^G9XOo dCdŔCITCcC=D^C+CрCPC1B‡ Ažl)CS²GGzpC>CqDD*wDgfB\CW"DD FCDC-"C%^BxË|’AyDo!HH'/GG;C "BAC%DDDD1}D(C9B=OfBiDJdC1U C'ʋXü +zC.DBGH'BhA;)ð-(CxC@C7 +C C4\$*C,8C9xC:GjGoC|KL`B3d3DA  +Ce:D7{C.BZxY0#C?CBA(/GYGvnG,G1D +"a4.J DfCцACCߴCitBBX\hB`C'JB*3BhCK/C@_H~8CzD`xDY~IDvE+fzEQVGFEm E[CbD9pDTCO>H\ID\D"mDc"DD!DEHy ?G G3FC0EEEHDtC +fI4 IH} HEJDHFRCI*'HyUH*?Go GFhFb1E,EEcEDPB|B0CfCCGDC^RA0H6CB|C?DYDGD\E?uE_GNFE{DwDDhHCKCGJIHI.D@D9D$DDEHd*G2G,FE\EjDDDφD_I @II0I*k)D%DdFIQI HCH!G[FFF'$F`xE\PE~@EKE7pJC=Y8oC̰B&fCxLXg /H4CBC[CYDE;8D͵DWCCC=C+ÖctD AC^qCeSB7-AS3CDa@yCpB~CHSBgw†tCCۦzDGDDE,'ExtGdFۛFE=ED HDD3C I +(@I+DDܼD,IDEDwjEHQHxG4FFEͪdEH]ECJD@qIhݰITYHՕIa(E'EEUEDoDbC¨SCX%oI`IA DwVDʗD.qDcDlD,FEjHGGWFSCE7EE5DDDX=IPI@vI ipIEE #FGᖻG"F/F+IF#E E0E[DFQCՖCCi+CծBbrC)Exe:@ECkvDD#EEzE!=GQf9FJ6QEjcDDTiCC$CVHފIƐEvF^FFRF4{EE-H\GvuGAF(]xEwLE_DDa!}CIrXIH@I DD}EHH,G0GFF4FFwEGE*DyoE]{_^C{C*f%CmtB(bHniASD CD9C sHD:-D-DaDXCB^A=Zjªk`w‰/H`H}C{DwDYDgDgBD=jDvE +DemD?BvBzCi/CtCgI"pI!źH@HDCźD,EEQDD*C SDck=C;D3bC1B~_ÉcE6BQSCB9B 4H'|@CzB2eÏm®F$ 7ÉBQeB9B4CHBCŠB@f;HB7H>CNBD¡VC0CjwCyCgu@ECdcœɗCkœ~Ci;BmIpIV.HDHED&D=B#|CvDLC.C D +BU3B(¹>D-p‹0C>N hB`q[ý\fYB-ߠC[)îGhCCDdjDD#|E,3EɶUEG³FɢEãEE{DDDDmDI 0@I#hDDE yE%SE8;E#E18HfGN/GF5eF MEE)EvwE:IIIIW;DYEFYIyHeH+vGn_GFFn|E'EKxE_oEuB2Bt@BC`C*.BN`Hp/CJLøSC mXB.oD@D>EEUiEUH"pFE?EZ[DDD[+YTIIXDmDՒD DtHEqDFOJHDH$HFܲ~F/qxEEF}EAD IJNI@I;E&fDCFNIvH}H G\GThG<FzF!Š+A3B›CVD1$HzC1(B aTCDD5:DVE:GF{ExE DgVC0DqkÀHWIDBUDDiyDEqDU{EVHhoGԅGҶF;&E E:yE% +D!YD IIHHXDDnIFSIHYH0!GzGF'Fx6EۤaEhEFnE>NC2 ~fCF`BVvfè7A!BF>^/C&C +CB7D`CCэD bDBCE˓C3`‰DFCMTBZLGHc@ZnDowCpCs?B4{B$SBZC(D\U=DC C~/ļCCf',>BHDHZuG|GBG؇BEYDDDB|CTCw +MC»HCOZMB=nCnCWC[BDBOKH"D+FDt,E"E;EZyFFw/F5t=G}RFE>E(IE D+DKwC$IʉJ$ECErmEfE(4EWEBEiH*'GGdFEF +JE_EdE-D,JXJ7IIxDEb(Fe3ILH2KH6,:GOG #GVD><ȥA1MSzCmGiÔ,C1CvCyCC/5C0DfEZD!CBX%Cx>CÕIf0I|DND|C{DՒD7{DGDAFEEeD^CD$.CbBCAH IIAIMDwCeDGiGFtF EJYE|D1 DsD+Ca 4pNCJEC! VuB|CLfCqgeCWCEfAQHhrA#C &C0!cCyCDR.D8 gC{kC`CC\BevBC6/KGa"Gw DCضD\DDDPEED'EDID$gC@CtMDC'HH{4G[GwDD(;.D~FDXDCD]&D!C5DCCDD%bC*@CISCFQCijNCCW3B'B^MAMCIjHXeC,ϢB뒷C~CcDkDHDRD\jCJCACH6 B!b o!Hp`HDDyCKC@DRDRDNjD1CDKAsCWCT*ÎcB(,CaHuH͔H! H@UC=̽C_ +DgDED0 +D5?l nD()ͷ? :9v/s` +C('Ö3ҍjjڗÂG€BGCC5D[DSEGGEjEGȮFХ1EE DbCzDRD II4WDXD‘ D{3D]ExdE FHHGΛ F")FEU;E^%REGDI}&IHeI_TDE + FILeHQHfKGe\G0GFmFE(E4ECOV>diCкC3BqC CWC̓G4C .B_BpCCfCYED~DC!C,C.|C45C,H1HaCD~DχDbD)DD%FbE";EcDyC6C SìCC}I4I[H+@HPwBC1FVFm!"F3E23 DD^WCCB.CqC2ICrXB|B<:CwCH0ÀCU”"CczI|ȣBceByÄ)CB BcCD%H 0H \CHôC23b!HA^QC=BIC +t3-CsY.CYCnH D@H dNGGMB:B8B<=D7ñIJCCjA+>ĐsBXX!B$Àsz/PtC9*îJfCȿDNdChR%gH,C|DfpjDE/EJ$E|)F4FFGF;E\%EFDEDvDODmUI}IQ\EHDAE?p+E*EyOEyE&1Hx{GG?}F$E.ELE]ӐE?DuMI?HJ] I|I~DwD rFZI"HNH+MGvGnFIFkEPE>EHEE=EEdEEE!DD!D)LH.DI.E \D1F)IIH9HhQNGG2iG"F E]WE.E;EIyÈǂ×CB79DNCAH @CA %BODDEiEXTEK\E0RGm F^EߜEW$Dr)D.MD C-I8IE3EzFiGbjrGdF;F-%FPHpG+ G_EFGE$E E DDIΞ@II_IHJWHEG/GGCFxEҢLE'EgcE^C2OÆQC*nkߦfC6 Cb2BH ;C|BgCAWCEBjC#CJC$CCKCCCvZCMClÌ7CHGnG&CDKFDmxDtD/qDеDgDDDI0J$H9 I<=D%D3FzsH;HTI?G-G.oF#FoF5EYEMJ EOFHEoGEW~EiDbDUUDXIIE&bEbcEUE4EEoF/YHH טGFF#oE촾EE[[D6PIѨJI(ISE5E=)jF ICHSHahG*+G1G[FDFqEEC@EEE撘EEktEBIsE#|DdDaD(`FC+QCiXCߛDBGDD|EqEGF༺E[UE5D DmNDSCDI I4DnZ+DE_D:D1 DھHDyZE}kH"HGFFE fEMUE4(DLTIII I0BDDbUF8IGNHcH`eGG0FHGjFbF E/YE*EٟDC(@nBB"Gn6/ZH8ÌB'As]C`BհC x~Ch”B Cb_BvB;8r›XC-G}G@A!C'Ñ_CCBn4{gB DgC"C}a?C ©C G@u}ԫGbnGzJtGƀGp g1 "DDTDbB8;BeW)]BC8`CIx–YA Ÿ\CĬþaHM@CPdKC}{BL\C~C}OCD[`C%nCSLC.ClՒëCG̪HDU2D!DɻDD 8DiTD|E)D=eDDCXC_u3DOq CH@H2GlHCCgDgED6#DX8 D5DDXԘCSDR8D4OSCB=CC6 C C]^C2F\CCB&oC՟Dm[9DοE\E{=GwFEDf&D CD C !IPI/DmDi{DCuDSDE6HsGGPFvEQcEEyD9DI¨IpZII?DVNDwFF.I%AHH)JNGgG?FFjEEElM1E9sfAACB3×r^DC2H-˜+CCJKlY@3ӺCC33C`BCjC0LBtA)BAW$AIG|GC@DfCs"!CBB+BׁDaBZD!qKB/]Ex?UCV)'H HGWGCflEP:D.NCCsCC"@Oà6MBִBnDsCc2 BqAC%CVB Ir CWG3ABxC:|̆]DDvDzEDvEHڮGOEɘE=ٿE(DD;RCO>I&U0ILDӹDdZDˏDVwDD;E>HHvGFʹF!s~E7E~E( ,DI`J 2I,y IU:DE((F<IUn}HxHtÓGG@j:G$UFFEnEEvC<3tCfy[B}5C2C-HA@ÔpCADD8EEA[ELF6F9bHappG_HFNmE:EYLEDыEgIMxJI'9EswDE8EO:EE/F~|I~H|HLEG0FHFTuE:EvE8sIJ IJJb7E}KE}0GFIUI5hHH[`GGHGV.F%F:E숬FGRA*rC1#D6^ACMC 2ByCGíBy0gCDmDKyDhGEgrD<(C)DBHCYDDz*II6mDD2DD2DDDF4GEtEzE(D҅DzDDNDODt^wCMDC_Ce`̰CBCHm33C\[CuB GAƗè^ DRD+DEfEGGˀFjmE2DG DD:kDcD EIIWDDUE .EEE7EH0-GGjpFTEEO'D(D\D`NI`J0I,'Ib~eDGDYF}H6HLGG&FFlRF E EL[bDzEC$CTe5AC]CtbC BkHTB:8CHCCD;BaCfCC`‘@uC~*C‚iGCGC9CeCЧ]D$CAEDkfBDC*D:ICDB.QsC|BZ-A"RGÖGxGGuB RBRbC/`E"DDBCC>3ۘvcACLCCʞBCHegD(D&CH@I fHD],DD;DEE (E䜺HG-G86F2~FGEŝEnaE:SDe+I@ISHwHqDfsD\Ff܌I,&HHEGjG`G +FE.EEiEzC]\5Cw>]fÍVDF@@FBD] B5#!BCrD:DEGGFEi D DCTwD1HDC\HH@HlCICNDDeDCP=DEH0gGGjFKwEٛE| +E.DCTD{[I@IH HHD4D5FexH`=HFbGG'FF)FqE!EoDcE \"NBXDCsŠzCPhC[F!@TC͋CyC:D~DKEb3qERG9FEiEpDg%YCpC曻D +I,I`DDlDDIDH+uj%saCCD"C8=ClQ'DǭPCgCBlC֬%RAJC!mHFHWGH YC]D C +EuC^DFCſ$CW]n=[qÐhD +C*CW&C)B빙CG?oClϋBeGd~Cq[C5D8D +DE=ESGFEK[E8D_/DjiDh~CIk`IV IDpDEE=RE(תDDAFH]HG엀FFF"E֪"EoDLEG)~DGhIJ H@I/VE%DeFdI[HԸHz!?GIGDmG,NFFE?qE EFeRÌ C>NCABH̀I Hb@HѠ.C^D\ID3EGCDDˣCDVDԎCaC5<|A CPëD^D]CCD&!›+%HHCˠOÎBBJC~DDkDTZDDD~D'`C&CLD= H ?Hc]|D ˎD;ClY"DD[D DhDۉD'E OE_DE +DNCDiݸD$2I0I]c H1@HC xDqoDGD8D¼DHD"h:D{IDaC;CytD-;B7C hC'$C[RCəB CCC6?DYH} CnAB'C#xC}A9B3PbQCCDҗxB˯-CҷBGGClC+CVClC;{3CN=fĻCKZC*C7KCmlj(OQpgGxG,GОH 7Gx]+3DQ7B(C2K»BÐ~'CȣCV7CǘB™qrkØ CPPACHxXCC?#pŠuRDhC|CޥD!DGDnCD4NCD CŴCwHGHDM+D[-_D+|D>,D3D#wDߔDi>DhE" DD!DMCvCCHAH +HAOHDZD&DA3DuD(SDS!DA(D9KDT}D79°CRDsZ(B eC(C5&BiS3Cr(Ì_BrC[C +C<[ CB'wC/OBHnB7BBHhH+C9iDH7CDLGC]XC CBDCKiDo^C "/BGá³9H%H.AHHB2B5CEDDvDjSCCD1R@5JCgf~AﻶB%#ZN—=!C!rCH|D@†CeJCFC"DcD݆EDPES4DڴC+u:XB=~8DWNI IvFDrBD vEfDHLDrSDkBD}FsCEqEHD mfCC /i/VC\~I`PI5I IuaCCzs'CfFF#cEE8D&DDPNCwCCCȖÒC=`mÎA :BCRL0zEPCtCū@ÎvhI"wDNZDsCؔD5C~̥CCLDCCB!Ë=gGH{DGpD-̞D#&DT]D/5DwD#FDuDjBDC8D#D9VCCԇGDHAGH`CwOjDD\fE]PDěDWLCIDID<YC,FCbCh|BGC*„5`xB@vH I&DD?E>DE NEHiEN5 EE&]dEM]DDDC27C̠C`IV-IO I& IcHDvD^EDYERDYDَ1DoC +CD'DjCnC3CvP@D(CÃCxtGԗ +5 +4BW,BCC*==ØB{ BC5ؾB01/“.GoGn)CCz>nsBQ.CRgBXxÂΩDurCBSC*'FH-Hr DPCDD}DWDWDݏNE|EHjECnFE/EDkD<[D%y"D.rHn{@HHKyHCDWD8ECDgQDDO7CD +D0nC~CHCQCaCGp +C ^)CWdDDfCD@f%cEGz)Zø €{C7C3D,PCDjDCB}C,CC(ERË.GGȒCmDWD[%DCɚD4ߤDGD:Db/DڊDDG`C0CB#}TCkHʾH0GG!D8 rD|D9FDCqC*tCCD1ÄDBCC3tCZC~Z%B_G6BC8D*%DDbE>GD, +DחDƣCl8C6]C{C4@vC2I8IwVD%*DԣSD)DE;E,EERZE2 EHDtCˏC>(hBCZԦ~IIIGYIռEsE17EE=|*DgDH"DDzQDH>CNC DUA& B~Ck?B# +CS;~CswmCd9 GfCoC^CCDH#D5DP9DVCe5ޡCEkAIe&Ch:]OtHcπH9CzC/D +D%ID[DD%>ENOD DDz;UC+[C!/B˜EH)H[ HuHAaǏCEYEZDpDDD|=DpOE^DE-Da E BH3GGj7hFHEE`E{DzD+2IPI5I,vI]RD4[D$F}Hߡ}H_wHGG-ulFUFF;EuEFE7ESJJo0C ܬC)ÞCCØAH%A@BIC@]B ^D ԄCkD-CCGD1Q^D C*nCsCC GHCPDzWC"D9zD1NgD7D:DM7D%DD+RDaBD +DnEÁHRH̖H]HMDJ3C:CD&B_ODPWmCN2C¿+CoBMCMBE|CWoBhUDCԤ—Cpp7MH;0@C!B]GBFGCvzDtDg+CDeAWCϢNBQǵDiCaBn=H?BHOC"$DJ^D,D D3 DTE;DA QDHCpJCJ`D&P×6' !HHHH(6VCFCznE\DDWtCCDhB~DArRCF|CýCmHHMD +D!DDVDd3DɠE h,DDTDfDDD[ECD9~CwxIMIH@HוD!D\Du3C{8ACgD6DQ%D`BMtC7+C(D47uîӦW$BMB;2³alCD/UG% CHGCTB(BC=(†hDHCC8CkCCC8Co"zH?NHO$C V9DCؔ~B4C/ CEDoCDBCAD4CCUvH,H>ZGuH&C;#A6ٙE.wDDkB_YD ^_{C/DyxCMDB?CBɮC[߮CP<0M€:EÑC{NBC;žgCSC6FsE +D[P;ND-$nCfB BaHyH=C C6^DC BC_4)HlHHHKBC"CݑDGGPFEErcE}FDDWHDCDNN‡Cͷ uC7{CMg +B${CVCOyC =ÍBfdBCJCvAXiFq oBJC 'Cz CΉ{QC"YCCq3CD0z DCfCBGGECg>D#DCQfDC:DDYuDE]Dm.D6DԴdDb{DU=UDC>iSHH H"@H9CXhChkD3DS9CD](C9DL2zDCޙBPBD D7OCBf`' CB=BC mC?ýH_]CsICG .NCWsD ODODDtD"1C6PCCB>CKYGHCqD+RD_D\D>D59DDy TDDfDD`D3DuhCK#C~ C՟YIPIHHqkDwD@f@3E&CA`D,THD5C4CCvÒ>Cq%gBoB\C_#G=BoC"XC>C:FDI)CDZDvD(E35EwJECE|.G$LFSE hDrDL$D D\CqI.wIU`D[DDDDDOE}GG9MG|OFELzE+DcDD"IxI?ID0IojDtq.D]E@Hx_HKGp,Fԗ_Ft7FroEUSE=;EɱDKyD 4CvB6 C BLB&C#fBC Hx@T3CfB4BeLC BHD ?\C_CbHCNϗ@$?\|bBG G5>CxD{aDШD'3DDD#w6D(6D7<DVC3AYsCC_CC'GGGkRGG˞SC%CeB,DsOC By'CVIBbV/ovB1ZSD(ChC_C;xC&sByC +He6@C&m=COC+y*CCJ0`DzD RD՝D7K9B3DsCCWC2C8HUHȕD`ڸDS DVDDV5DfDI-PInbDrDӲD>DDDElHW}GGaFhE&ErDD1DnIvIZI,(IdfDOsDF1{IH"HuGVF0FvF_ EEE.E1 +1CsuCNB CClC7HgB@ºDqC#CV\KDԶCTDECDOjDԼC BGI+C 3OCygCL#GJG>qClDcDDUED3@CDHrDMw D=DmD%DL(CȬC gCQC\;C/GHHmG +GhFD8JCDDgDDÆ%1DfUC BVC5tò}4<B|9"C"BBX$EÕ=ÉstAg!CK7G-BÁCIC޼C[RDM.(Dq.D@C\FDpD*VB Cp0KC &'C[C3GH 9ClDDTDADwOD DDDu1[DD}DmID4D +\CD/YI!I$]H6{HPDDCDo DD Da_C3DxDprCwCcCAC]UCLC9}bD_Cܮҏy%#CgGfC]CSE"B B'C 3CaCRD/ AulC -h}RCwCUG[GP CbCuDd`D2C|D!DU*DéDynDCDECCuBң@v%GGnGIG>CC7D73Df7DrD nCqGCTҜC[oCD! 8)WBZBj^)@C}C )C!B|jGCPQ6NC0DBRhC{CD^!DZHDhbD2"D82CKs#~eKAHPHN|D>DDvZD DC2D+ DiDֲcE+ADzD9DCCDHI:H@HnbB D8OCI3DdD73D/J~DsD)DNCIECuC>1C.C#CBBJCBC=ið+CGCDF:pE-EjEnEmF9eBo>?2Bx DϭðKC>º"iG +Gm®C CqC}B`D*tCnyCC$1¥ܶCĢC[ԯÂ\GR!GULGG>?MECߙEWE+D^DMB:qC Ë-EBH;Bly'Ê×(NC. Cq}YvRC!eC|5BВB]GCB\BXdCHB)gCCCC-B%C"ld,BTA'B9GGϚBCADF?D$cC.g£?KAD&CC=RC.A؍BRi+CCfG)GGH C[#1BȻC3DD;5CAC)A BCy$ÑBCJIJxyEEE,EEEAFE+K#EFާFd5FqE5?=D$%DuD1D @A:`II!JJ=JDZmD9E3G,F/FQ~E\E-Eb5D&C`ClC CFDUD/#CDnC/6DFCoD8O7HP\@D!XCs,BC/PDk D}EEDfDsD4HC;KCtC6'\ChB=ZHL HD6DsCݎD9DcDH&DDDDDD~DQD SC:CzKB\CLIPIFH HDDDD}DD`C\8iD;DX}CT^CBfCCTBיCAMCPCVzC͗C!C@HfҀAV'YB|CqvB0sBnC|D=C?өB*B]2¡B,HsH CSC1)C C 5ClCCYDA5B,BD7BbC~YCLAtCroBD9FD:CpLD}CCJ$~=HH?HL@HV#-BȞCEFDVBD,Cʆ~BCgAL}vsACBdCC+CueBo HB +cBHC%Ž_Cs-Ck0B)33CLECBrT3B¬<‹{ʹG*BGG6cCoMC]g+x+DCCdB^]DxD%C͡C_CCuC^,“kBwGCG`GG&ecATBtCXfD6CUC|GC&Cw}B̻BwC)qQK7DŸeBp:C UeB:қ-.\C'GvC£]B`BqCjCDj!eBDrBCG6CCVwv@X?CcGހH9D>D:6DwCz`C\D#DBDR4DC1D7CfGC DDfCBWCboHZ I@2H 0HO Cz˦C +DaOfDkCDCED C4PB*CAB4C4KABxIBC$yB@Ep*HCx:G+Ã+ZB]B#(C%jC枃DPjrD/D]f=Dc)DJD@C[CNZCm`jB_H@HT|DgX DXC)bC3D|DCDf[DD +EXQXDD5D-C D/CI3[IzH6HyrmD4rC214D'D)DLJDC%Dsj_D0@D87Cpò@,CByCAKCC|LC[Cb8’%C [nF +4BkC8WC}DјD !DaNC DDlCR$6CBByB)BeHsH.CCiDDiD00gCwB2xD6qCC8.8CxDVÌ)B@ӷCqQHp@HHVH-QB+UCݼDRDrCW(CKCBB[kB+Û C=] C mAiBdzB`L!{#C/BjH*@Aᥪ^(CusSBCD'D9"DDDʨDC7D"C`CVHQHlDDD!ADrDF\D+ DeDE c(D’EHD@hE[D*D %DSH?HJHF]HiDD {DKzfDD"DgHDv"DCCD[CCq@ TCQNB߫CCC]A-iBϛC5|GBCۻ'BWC>(B/¶1 EChBOED.Cp$%oHB2׊|Å8GWH +CgCSDBD(3C_-HCEaDbD9C~C%CcX^B.HH)HH!?!CCMsyCMEvkD|DC,վ$B>ã^A"C DB-B xkNCB+B ʇFhD +W D_EEUEEAFGVEFD qEi)D9եDh!CADBIDECxpI,IkDDD֏XD1EzD6EF(F,*FXJ ԕIpI;gEDjyD@DZGcTFYFExEDE'zD!A?CPD+|C:Cgn\C/B!GOQB*DC!GCS]jB[`BٚrC n°/CHeqDiCKC CBEz§e㕏BU3GG NC3C'dZC/OC[adBCaoD PC.BJNz6D%Cڇ7C £kGqzGx|GxG cC,CTCDED.aCCRIAަSqwC<WB C̈wC5tDB/xÅRB^3Cv7?cEGCIBC4`C랢D CRD{DA=DOW%D;?C$C`ACnï C_IC2G HCmDuD>D<"DDC:DӳDYDCDPD @D"UJDC5>DCI)@I}HoHCCCyDt3DC>DrZ6AŹBD\e %Bޖ8WCD"CqLBn&C(CnrDeD:G9CC)C\D CDBDXEC>ª]OJ CtCJ;C5SH4mD}2BZdյCsG2B&A)kC@CwC9µ/Cz7BUBCELC sG>GRCW1D nKD+2myjâgCSC3+DD6.DF qwAC*GhACyGφG_GgG,BC/C?D$6CCCC-C1@OAb +ÌC!aYC΋CCXCIBR,BÆȴHcBVC>CDKD]DgDDRD4DTC)D)CC +C#BH!7BC,kfH^UCC|dhCQA5C6CCYCD+YDVCCHC`߳CvC\GɀHxDzCgC!@fDDDLDDD@DyMD!`D"YCCJ)bCPHIH#uHbD]4D%DmEEDWJD5:C3CaoCBxCĩ$7D9jB +C:-C_Bx GD~C2wC^{CLG4B;CIC!DcD?b2DUD'`DbDBBIbcBB|C>C.H`HCCCC^C3CD +mDٗD[WDFCiZC^eD48BV] QlHAkHG4]HHCAA*33E\E;D[D9Cj_D ZB?f:C|^B C}w¶ClÕ4C/C-CԖCHX¬9'CzXCBzD6uDӼ E-oEmEYG%IF&R=E&dDDgCC+AC(IҰI+DlD.6D|DiD3D6jyE\gG?G7GFq/EPzEGD4DcLkD)ðIf$ IIlI.5DD1RDdy(EsHH!GtF-FbF]ED+E_j{E!WD1DGC+C|9Cx-uC=S$BB HO BXiC%"}C7CCxC4œClgC^";AMCdH H[6CϡD&bD5D.CӔD*CDBzC[DcdED.2C.6BzDC(Ba^Gh+GSFHRHCv!C3D5ܝÑC_JCCXBC}C@C&C9 CBC&CoOKæC}lCYACuC>{BB ÍSY0H8CMiCw|ARKEE~-EEFiBb68DcD)D\DPjyDUQD,=CCjHC`I GH nCaC%C3DDD@yCWCDL,#CC-xÁ: zCE.YC/1U>DØCCC!±H}dÞF4BwC/%BgxCsHÕCV‘PC@MzkBÔ.6[CSGbHKCUDWD{D`DTgCD+YCЃJD mDC!CDCpBMdH@H GsGHD\^D:C1,D +|6CD. Rc=C2;DDKc]AnBBFPcCZ@B"hTC][G]#F`BCPBdCR{CwDf@ED HD5DBCGBґClC":3YC Hz!HHDRD/)D DV}bDG3D|DADfDdEIDQ:D3D4ƇC8C˫H`I-HjH;VCCDXD;%D'-SD?#CD]Dz|6B?CT€DJClK5CBfC]ICCEB?B`J4Cá¬:HlÇ\CcCCl=%A'\CCCR=DmBBOMCsB3-ABqJBkHC +HbCD2E]D{DDDjDg%DvDDkD +"C8CVr'[;C)RGb1G!H"HsC8nBBBE-yDmDYCoC١DjGBAf:C=-CB }Cl}CC΋0Bϑ +C`CSBiHC@C7aCDB4BCݑCýBeDʞDD D/OC,C̡OC]k`D 6AeLH)VHD8D?D=DvhDӚDTEERDC9CTC@C{bCCeOD?BC D!CHH@B[1Br&BږC@D 2CB=C{CpmB4wC1—FվkC*G4H 8CC0D +:D+#B'33Aӄ0m!D8'%CKUC8U((k@BkHnHnHHUAC:™3DD-Cf1CaNä1LBCoBABrHC3QȮ/Bb2BFCT:VŸjCC,BaªC}CLGOG1C\C*C3^CC)DNCjCEC wDkq­eC5K;C!@dRn;THa8HgGG#r C$`DCLköC3B=C8B|Bx AȤUC)C+OCZB*ٙ,c6AQpH؀C}~CVC[ +ClC^tC 'DDD@DuCSA>rC<{#AC.C;ÃCCF^4C&C"mC C(nCD#rDLD=D8ZC\CWChP_DHnB+C'CbDHHD1D)5DbDvD3DgD%E"IDJDCCؼoCNCvF2CHH:H H1DY_D]DE"D8DDCnC~DwCTY1BPBݽBˆCC9ĂjAaGC|1VcC) GRA?¿Q=X2BzNCZ]CIDDRDn7#D\D;D D,BCrSC-HgȀHCD[3D-DcDfDCYEX0DTE,E9BE)E$DΎDCe#CűB6G:GAH}HD DDDojD DqD$C}DTCRDBPCKAtCCD`CkBu+jFCogGӭ7dCS6C{BW CBDBB=CtvASV~B?ÆPG?G gCUC]fCCCiDD C6MD +9CuB} CVCEBRCCH>BGThGiEGGC3;PCtBpD4Z7D/0D +%8UEt…~BC@5\BM@C?pC%2J w}C?B-KE!CmjH @CEWATةlyC}D-5D*D!5CWYDuC@D@`CYSBECXCɓHրHۻCgCUD*C:DDDKDD9E-DDGDD#C@C.HzP@HG!HRCCD8fEvD3D +DGD#˘CtgsB" ›EDC ,tÒBmCxN|{D2A4ChbƒśHlC/CmDs DECEdHmE˂ElGsFE EDDWD*DII4D%8DD-DmDDDE8Hu-GtGFEVQEED9nD +6III IF|E +DF]sIH¥H4\GyG7,F_FlaEVdE(EBbEWCB€#Ñ( BȍUD.CH +@6CC~-CKCCбCD5BCBBA CG-C5GqG55B{=C4D0RBgBvwBm#D'VDKC]C{CkC AeVAlC3"GtG3GeGy+C0ϸE PD~DZxrCBuBx@C|ZlC8Bv‚ACEfBeAC#CJ>?Bb^H(yBdDxqDvqDucE8D֓DG\DWCvC`d!COB4@vCP"HHD3DuDQDjDgD4DDLBDDZDӍD^D{&#C'BeB;GCŽH`IB_FHyI\X…xDC7HDD-D@sPCƱPPDICuTCACuC)BMC ̹CE80CR:Cz+00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_04_ND006_04.fcs b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_04_ND006_04.fcs new file mode 100644 index 0000000..4fe4773 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_04_ND006_04.fcs @@ -0,0 +1,68 @@ +FCS3.0 58 33307 33308 57707 0 0#$BEGINANALYSIS#0#$BEGINDATA#33308#$BEGINSTEXT#0#$BTIM#13:56:04.11#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#30-Jul-2025#$ENDANALYSIS#0#$ENDDATA#57707#$ENDSTEXT#0#$ETIM#13:56:31.28#$FIL#CellCounts4L_AB_04-ND006-04.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#674#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#356#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#433#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#403#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#537#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#922#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#712#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1119#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#329#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#329#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#272428#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#351#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#412#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#301#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#213#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#251#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#215#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#298#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#447#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#315#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#354#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#946#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#258#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#225#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#232#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#311#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#598#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#415#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#56#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#56#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#241#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#241#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#272#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1017#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#479#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#464#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#468#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#464#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#287#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#519#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#422#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#667#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#491#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#645#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#286#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#407#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#714#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#784#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#142#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#231#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#326#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#232#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#187#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#270#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#967#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#529#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#274#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#590#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#476#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#628#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#477#$PAR#61#$PROJ#CellCounts4L_AB_04#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.78#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_04-ND006-04.fcs#FSC ASF#1.22#GROUPNAME#ND006#GUID#CellCounts4L_AB_04-ND006-04.fcs#LASER1ASF#1.1#LASER1DELAY#-19.525#LASER1NAME#Violet#LASER2ASF#1.15#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#20.1#LASER3NAME#Red#LASER4ASF#0.94#LASER4DELAY#40.625#LASER4NAME#UV#ORIGINALGUID#d675b188-bbeb-442d-aaa8-502d036f5aee#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#04#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#FýBAOCSBSCD()e/C$=C H.¾*B*B!"AeB)OCK GʀGy%Bij:uQ?BaBCCVC¿D#JBpKcB!ÛD0)CGXGGG[C[BnC3DC-}CCfBY|2“$C,Ae8%DnNBJS+BB{a)QB+ZóuWH$hUCeCA၏C(@C| DGH FGE.XDdiDC|CAi@H`H6C/C"D_D'DUD;EHkGjEG@F%EE7D1D4Dc/IHHH@HѓDO6D +|FHH8GGF|FF E ET%E +0E9kCȍCnD2+DCgRC CCD 9G1CzqCb[&@"IC C +D"ËC6C~i; O3CfZ0CE."CJGlG>7B;+CC)Gv wJC'|C(CGyGC{CPÐ~mܑH]BW CCpUDXD#E--EErhGMFH׈E?MDDeDzCٯ_DQ8HEHgDXE̵E|EǀE$GeF`v}E2DD[DX2+D I2MH@I,{CDjFCD9DDDo3D?EkHIdGuqGJD1F)'E E:DSDO)C݌IihI5IID DFdzHHB]GG>F|CFVF%EbE70EwEC.C;C>^DCEBjarmdGACD>DcDfLEdE EG\F`<,EW[DvD2C2D:{DlHInD.^DD-WDbDFO3EOEytH"GGUJF39E}HESfD閍DW%C\IIU}IdID\DTF3HjHHGGFcF7HF!E+aE:DZ|EUD }A.D(BCCUJH1tCx%D-D8E-EE_$G8~F!)E,nDuCڜCIBAIHHGDD3CBWD%DZHC-C=G@Q&Cf?BCtD:H>~HIHt&HkBCˆ!EDpD iC?Y}B$Cm9C)x"CX|È23!BġBlK8R*C^C7@*t(Gb C\wCX%DQ$D.5DE@bEIG:FpEND̈́D͂D ODE~?D)}I6I$ DQC|#D BD4DɚDWE֐HtAGÎG7zF}ECE{E#-EjDtlI(Ii,H@IMDu}DcAFTIWHcH+RGrjGؘFF]E E #EjUEwA?CAC^CCVM"OG8Ba{`=@CC4!BªB+,NCDB C8CoGrGqC +C)(pCC|?CgB-B_GC3CiV GC n;+|BC?EGJGQ*GsGxCC_1C0CSDBC/CuC) CCEé$B C,˜b6Ba]C"ÐqzٺxIúVFZBaC!B#rMC$b=A'[BޑB5Bm*hbQ?pGGgC_sfCCOBC1DCvgCPBD!\CC>fCעBOB?G|G{GG%CYC&`DC.DBzC`cC@_C1bNSWCR:Y {%`C8C@ 3Cb8B CHs@BnC CjD D +E7mEFE1GVFMPE#ZDiD\zD#'CنCeHقIl^E>FXBFF҄EEEșeHgGoG?FzEACE-Da +DDpII8I ID`OD?EHpH; kGGZ"FF^FO ErJE1NDEHE3f@Ck)6l# +~BkS .PB!RH@CPgCُDDڟDLE E %Ep +ElD{DC)aDDTD+gD:ّIg`I EE-E*F F,t:FbFUF+FU F'ExE%dD DD |CC0HI$ I=0DDoCrhDDDEΞH+KGGZFBDE7Ep~EDeDX`ID@I5II&DDwF}H"HLG{G.FF|#F&LEKUE4AEE:=DCaCNC0D CYsCSTGCL#t!CaC79BCnhC )D.:C-BgSyY/œ@'ځOGG4RɼAhC@CC[oD,-CeBoiW1C3C[ G(GπGǀGu/B@fC3D}kDF7EDržRD@AFB CB'SB[ÖÙ_5B!A jáR,SCpÌ&C\gH7$D$lD=EeYE}EFL2F9FM)G-=F[EE_D.DcyD[vCeIޛ0JEKDEaEL3EEuF%^wHfG׏GF[EEEjkMD0D̐IޱJtI㊸J""JEDFn3I HH:G*GG FEEEb E/kEEwhEk/E,E6D#7DbD;5H#BAC +/GKGI9GGD];s3CCPzCBCdoòO ;C\ÏWB=CJq-BoCPBm=ÒBoNB HjBxCaA,B7&B:QCgC`Bc>B/jBFzA3A$?\DgÕ{GGK.oBg%CBŖC8CC?BN›#BjC4C"Gy1GzdTGGCC6-/%@33D;D=8DG BC3UZԌC;Lx]C%C(B >.-BC# +{ÛvBC;H9B9AD#E?!"EEF-7FAFMGxF{q EEօD)DcCaDnI pI扣EDTE%ZELdEhE[8EH_GhfGPgFH.EיEuECE=FDI{I3IIDeE FMHŭH>uG>GsF{,FF!/EELE;iE-IE8-D$D߬DlDvD\ODDyDHC4ICۭDADtD僲ENE:E.+G\y:FXF}E(IDr{D2D#)DW%B-~H`HDDPDH5DDsDcEssHGs"GKF2E@E!DZE`DlI8IUIAID$DkVE`H H;KGN#G"FYF.FEƙE8siE|E" 0}RekCٙCo3BCD#CoGH=CB {CCnjD?DISE6SXE#GaZFEjD'gD%dC …fh +H0I'5DmAfD;`DfsDEi3EEvGG@GC5G!~F!Em/EIEsEZD6ZDD6*IUInH[ILDDFIHQHM G%G%]F?F F"EEFSIE6NVE @B+V}BCt{B35nCLfBMHjBHppGяGFC}EDEE@vE6D@!IZICI^IL~EDҦFPyI7HiH/&GpGV{F1FpeEE7EWJ-Ekd£ZC1ňJ=JC< H*D D|E=E_FFZպFCFt{GFi~EbFED6DDKDdJJ=bEa/CE5WEEX=EsE$F HY[GhGbFEQEEADٮ5DxIhJIJDؖHE FL?I;XHqHzGYhFmFӲ%FMEőEnE\ENL,E^DE٣DDRDhfDJ:qC)`.H:tCBXI :BBwvBkD>FqCKDBP6 LB8B7CFBOz}HH VCBcyC ^D4gBeYNXD4D! NCT+F~/AoG!GeHHVC]xC +=C fE,DEDBT`BpRCqC BAFBCqCAѣC9Bl]C`{çQ{OHGBVC+CBުC`BD!QhCkiHC`8C% OCPC +;B!BoCVH!ÀH)D$ B C`D=?LÛ(BpLD/D5QDOCCuC^WJ$C?H@H H&HIFCWE3nwDլCC.©#qCvvC̶KCCV7¸GBP}C=-B{QxaCC7"H_,CDqDUzD)D4EnEԠEEGF`Ef^"DQDIHD#1DC5HI5D1nDWD DPDdD_EHG>G^GgFaNEE'E-D~IDI PIŻIjIDDF3CH\GHyHnGFEHFF̳5FOEuEGYEgE,GC'C*­#AC>B%B1CFD7DDDE7'E~wEȔFGF1jF,E DDeCv|CD IJ/ EJE"nErE4MErKECE5G Fg -FBELcD7DD]Da#C$I㡸J(0IJDDPuE`PGGFDEWzE-EO%DeDQDHDCBuC D) XC*wCD?1"D +/HB³Dl&DB-DeEaEpBE}F{|ESBDoCڶDB;>C@C#H]IiBR!CD< +:D,ѫDwCBDG}~FF!E{DSDQCCmC6]I5IHH=`H OCqC |E>{sHTGZG1FhBEEREp\DD|DD#`A^[^¸{})mkH(CHCQsB٩'CCfTD%ZCB߮C BYC}Bx^B8Cv€GG/~COA7C CrCVgCJC*&pC/BaCʬB%C(Aߌ${)C4lC$GaGf GeGCI*0lDGDkD <=B\î;rKS[h\C]B8t=CDMAiCUBTA%Ci$HhTDFCD1DDpmDEYETEzG4zFEqEDD=`DaDJdH+ID]ݕD2 4D6DDD>EHAGGG|F_E4ErE DTD IoIIpI`DD,F4HyHr=RH GBFF}F@EEEtEA@·CG$C(CÝȔuC>?PC@H 7C(BGC\2Dj9CjD'DDDtD'{B\5btc^C B!.CH HDCC_CmD&DCD3DDF#B?CB\Cr4C?K CQPH`HHHCC{CEI]DDGBU3C?+CBhAAClCÛ7C- +C\KCnC@*GBŸ` ZaA)C!Y(CPGDGSF?UE*>D*P&DD4"D2C5HwHD!HHDD,DkEFHFH> GشGFVFuF -EhE4EELÒ CADJB:Cb2C+&GÀZ '9GC.‹C;aAe\)DZoĩCq;C=mBrC 3Bj Ú[YGGCECWFCYn™U C8.gCY2BDICjD q˜=d>:qROBLC !GgGGRG8CVCaEPDDqCoBR8BI/CBN@CCzG0|4Ҕ&CEB CyGYBp(D + DZD!PDtEXEE.G{UFhzE_ھDRD OD:D@ CHb IDZ*D( D, DDviEvHZ GGjF{E/EjMD쾕Dl^DBzI8IHՌI9CԐD,F2IHRH/HGXW3FWFFIE{EnRE.E>CxW8BlMj@3òÒ1.C޾ BGIH}_CvDDE}EZESEGJ1FxED:D;D=C@*CzuI&\IYD8HRDD\lD!D4D +WEHgG\GF[EEE_E-cDID`Ify`I:HI( D,MDwFE3I&HDZH#GfaGaF%FWUEjE2EGE#C-cR`CQJCCW9#H8XABDhDDtEH}EF(Eb8G7dF1sECDdD;DaD5OQC+WHHֻODd7FG(AF7FnFE:EdGGPG#W*Ft{Em_EDDDNJIqIH@HR@D{DOEݒH5#H!f|GULFdFFn!FEVmE[wE#]D!/D:Bi®"Yc3CBeAJCpHa(CDcףEiE-OEzF;pF_Fa7G]FEgE2xDDoDqBxCֶIpIxE;lEρEjkE`!EggEFFHZGӅG6FFE)E^E(EIII"I@IEE2Fm@I1HvH3(GG F>F~lE3EvqE +EgE~ªE2EjDK=E'@DDDlGA]ҖSBCD#qD]E,>E#)G0F(&ED~2C̕C@MD5DsS=H HGDEGDDtD@x)IJIH`I^0D@2DmEH HGGvF@F$kFv]FEE+MEE,CӦA+CZCyCJCCDGTCA#~D|E2wEEFBF"FOGO`FE[E0DDD[;DCIbI#EDE;}EEQsEmF9HcG8GFEx/EC>E=)DbADI8@J'IXI0E DFP-I +p;HHSH"GgvF,F٫FREEQDFsHЅHMiGAG'iF_FFO EЪEME +E @C9CCBCICD HjCCȺZC2QDDjEErZEHE8GrFo EeD +DD+DDM!I7IN~D.%D9D?Dc@'DsDq(EH;0,G3GnFOE{Ex&ED~D$II4IDPIZcrD}oDMF`HH]zHG1DKFɷFĆIF8rE/Ep%DEmC%sB)C:gCvCrvDC{hHCCB, +CnÏ[Bu9B+CC&CBjBA63‘BA-n__6C~W¸ҡG#VG愬Ȉwy=BgC#CG?DCWBxHBzKCe9C?+B:\ƤGwJGyG#G8CAC!y3DAjjCcA̮ju C*EB窌À'LµC8BljBs(B$)A,)CkmiH[PÛLBp^ïaiC J3xDBDrpU/B,7ClC8t{H)A@H+>PCCJCCAgn(DЊCp\`D dCrC!A–ncB&§xdGߣGH! H!C7wCChfˌBdABf+C/b UpC P&NLZ|ÍRLC$Cb|Rÿ,CkQÔ{.H @Dr3=DV@E'EFF\9FGFGFE^EoDoDse6D +h[D0J[J?$EoPEEEqEgEF DaH $G!GXz@F^EW(E?1E+mELDjIF0IJIDJ7!E uEbF) H0@H@GVG UFF F$EPER]E-HE .E7$D +DKDDKD +"D;DCݬH0CCNDeDtD9EHEC EgG|FsEbDѶDDNvkD<@CI \PIE Dok+DxDDQjEDGE~H:۴GGpEFNKEEmfE1D-&ChmIII) INB*D>ID5F(KPHިH[H8G5VFфFFEEWED'D6]{IWLIYII'D'D F H¦H@[MGUG h8FמFΩFBEE*JDڳoE7t&8$C׶CKÅBgC؟CeJC[*H/E$wFyCC>Bj%B$>C0xCYAN`G~C)2BsCb–rAZGGlìU,CwD=C4C*ŸDDD'Cg7CBCZA;B99oC-lC6kG;GGG+^Bh4D&E-bDM}D*BC8'C|EC:wlD aYbDuCÜÒB ¾pC + X#A5PCHbBh?{DAs@D3DNE.EEG2F9DDu DCɌCoD3CJ H@IKD'vDJ*2DhtDDD(EAG˥GPG!_FEZE$ +DDXD@ 4IE}Ib6HHDhDbEHEH5{GFFIFz$Fu}Ed7EDEp>JlMjC:B@^BhCiC ^G2Ag-kC-DϑC!D+DADaUF~iEDDC&.B"Fƒ÷pB=CMpӘ$GCzc•ZB1A4BC,C_wCaCVlY-BكB֤A{CC'GcG8CCWB6g.NCJDDҺDD*C jC;BJBC{^CG¾-DlC/C +CQ +CC0CŠC;l34a>G]C|BHB-BD%CG&DvCnBi³`C=1 @eDvG*DGCC&C3C/ C=pCL"D CX.1CFCpC3=B CXG~aGu+G:G2XCGnΈcCDCC;(!Ch "aCgBEC!C*ɚ Ht_C91BC+{BDFP6)CVDYDMxyDE 8EjEGKFdE%E6mDDbD\;DtI3I\HeD%CZD)^DD-DE&bHhH҇G裦FEF3;EREfKE PDkɢI^IygII9!D/DƐrF I`PH5*HkGjGCG2rgFtFEEELBWa}CRCCcfH C2VD CD4DE, +EEXGxxFynECQTDVD{C KD˶CH I D^D}:DsDKD#gDkEH1XGGe4{FOwEVEOhDDCDIxIDHIqD\CODqF sHdHYGG,F“F cF1#EQEfE ETC|;CLwB4CfC̗C#РGPC2 CD8>DPD$EN dEE{vGC/CțPƒ#DHB?;C cBA eBpX nC?CCVB'AVsABꐈCNfB>GsGlWB30Bt,CBc>ÍfCDւCCFBzECbZKYGmGNGPG&AߣB!AD׉C-Ch.CCC$fšCĺXB5 CT7ClXC~C>MLGZ{9A&h:C/ Y]C2CCDeD<%E*|DaՍ1B?CB?6BIPH]7HgrB+;D@„k…)C3C2DEECE0aDO8CC=Ci|C1cHHwHawHr·DBCFtF@MEGE9XDLDD=BD 5[C$tCC(CGPepo-ifLT„H7CQCClD0#C.D+lD"FaYEDyICLC0ARDRAHHID.^EQE?E!E"pgD +E$GJwF*FE^{DdCD$IC*CUHI>IYHDHC(D/ESHGG#5FG"8EEݝ{EmDODDD9@CCd_BWCߪCuCY}C3û)H@A4v?C#ou GCTTCȡDGCW7%MB_A †@úC.&GGD dD\TC8tChCeR.CMBEAB-B'C~1GчGkG؀G\mCCD DHCЪCTDºZCB7v/CŸCECdBXdC|{$.\BuiC@?HpS1BMD +$DE$EJIE۩EcGX8CFYLEDroDwDg1ANC0-H%`H!E:{F/F}FhFGEZZFHG|)GLF2וE3EA]E)D1Di`IBIVCHHDeDF +0HHB G޺uG,FRF(F!-EwEhEeE&D C%A+BeA!HD>>CxC0CHK@+SCgB+CCVDBffCC/y0iCvB3n¤ ]BAʹGyGC>$D2bC@C2;ÒDCnn3B4_DB.¨|PJC&DC2í_GG)GG QGһCyC(DVD/D\WAbYBUeFux +BؓC$CV1B iCB$3qCDaBʧCBqHÒB~C*?Z]ÞHœ(CHF-RTEC*CCh.sopсlGG%nCB߿CjCB#3?xDF迊F>o F"}E DOjCQ?CbBGG GGCfD3G݊G4~FPE|E7XEDuFDLCCKDBC J#fCÙC%1B_3H +CBCYa&(C>C2C]aD?DD,ICY-C +Cy7 qBC)YHH&CseCUwWLpTD`CxgCR֣C*DD @&C$ TCBBr$xA!BvAHHHHH"C CC E\DDt7CAO'D#|CMC}?AD[CcAC8[,Cç`,CBzHHCMICBXdCO9&CW1CquDCPC^^¶KCy›YBk_SBvGGCCDŽ9CCB;D>CŖC!s 6G\GuD+C#m@CG`Þ)C!C0(C}CYCT BC-C8Ë;H +8@H GuGlCCBC+6C6 C9DŒ{WxCCd[ÁĤÈ&C,åEC? C*SeAIA2Nû,G@CnBLD8DB~DtEnEEe3GA;F=WE$D} D8DCBB)H" HkEL`F}G&FqFIEWFlxHG\vEG5 +*F_EhE.DDmC I^XI{Hj HUAC`D_ۦEyHOH)ObGkhGkFFF +IEB#E%"DyEjCLJÍ=CzkcuC>CLٽC:WBI!HǀCBC^JCaACDCHCM¥C5CSvR6xhPYBG)H€HBi7}#C BX33UTBDrCVC.e+ClCAҶS>GG7wH@H$| Cp­\P"pDD4XUCIC,]tCxkAÖB½CSC,BhR +?C2wrdJBKØC['B_cHWCYCIDD0DyE\EEoGAFBE* D$DY@rDKbC*D/ I I>DDD4@!DDfD5E8YHGPG(FEhAED DqٽD ILIaI.IS=%DDv8E]YH1H +Gu'F7WFF|FtEEEiEBB/)B-ABبD"3C>C0xö'FCOB"CKCCoC+\+D mBRCCC)CdB?OU G܀GC AsCP2ã!4XnCR~GC +7B vC!h8C8[G`GZGr Gzk$MB|9fC +6BO`CтõdCC% e+VB)9XOÖ/A@Wd«\)B>XAz3Y|GʀC>sqhB߅B)CCtCCC.{2„Wƾa)6+CzXnGGÜ-BÎN0dAs4Bԧ(C]lCj\Bn@AC'I°CD)+¬*GGcGŀG@COA]CD"C]_D¹˶C$Cy!C|dAٞV|@c_O\·C>)w0B3hHCRC07CgaCȃD$DE8OEeEqJ8GXFKKEBtDXFD,D4D3JCYH HD&nD+|D Dw.D'D$E\6H9G}GQ2F3ERE=ӶDDDuDTIĀIHcIϊDDFXHH>mG +GF&FcFݟEp`E=WDgE3OKC$ZCSC+\ƒ>XC1C#BҨPHcC{8UBBA/CY}r3ZAAA5jP CL°1 +ÑGtGCslC@G†xnAJ>34C(CECFCsV9 rC` lCWqGOnGNG%-G"`-?sAgAjDC"CCC-ZAiBɺv޻aښ:-„]C@#33@BkօB}B$]GhBP1AnfBɄC8ĩЉB:A\C ;C/!“sCKCLBcGG~­ #hQCHC3gAIDkxCCgC +h:[¸G9CeCiS(GvGGfGK@CBBC[\D CD6CV1Bҙ]AaBgCA>.B}C|]@AUCy\`[ýDA@CwL:e.COTGAåBCILYO BFYCCQCCћCc-LlT?B kÝB>GG".CټB${C8c3‡PC`D<\C/DCN.BC mC$\CCG:GƗ(GGIâ]3DrkDhC:C0jIC:S?$oABsC]|:CQv BBEu*CAVB H^h Bu@ͱC-]CC7=CC--C ]Co(B$Cj4B{C\G:GJC"LC?CiDB3tD !CpZCC#@BCU Cݯ0bG$G YGaGb48#BCvfD7DM`CD]EC;C dJ w>OB`BNho=gA׸a8a=CYC[gG C >BJD7DD^E(jEEiRGKFEcE#˽Dj4D=;CdDyXn>HܼIDSDD5 DԕE #D$@E_HpGcsFG<+F+Ed ER"DjDтDZI(IuH׀I?4C˓Do=E3HH.]pGȕGFFFfGGnG?G_YOCbBICCLC.=s*Xx/CnC ALLipBsB*@kVqB +B[)WCםCMBGϗBRYY¦0A:˜ CiCA-C5CBoB;f67CC yB{ŸGxGi&çMSB,?fgC%CK#pCsCª($C_8BDBC\WÚGtGDCGGBlB5&3DDLCJö7+OC>\\9CL&¢5C>&$`BUCLfÄC “ C*s|HEmCCvHD]DDE(OE~EzjG]FYE5,DhDlD(D D;uHI3PDlCDDc\D~ID6DVE~c2HbGpGDF*H2EE3bDDVuDIWI\I QI"[DD1.FmH HAGGcFjFaFE@EWD`DBeEeÂUCwC@RCHCZL2?GCMDCh",CLC DEB +KBI00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_05_INF019-0_00_01.fcs b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_05_INF019-0_00_01.fcs new file mode 100644 index 0000000..49c2f3b --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/CellCounts4L_AB_05_INF019-0_00_01.fcs @@ -0,0 +1,93 @@ +FCS3.0 58 33335 33336 57735 0 0#$BEGINANALYSIS#0#$BEGINDATA#33336#$BEGINSTEXT#0#$BTIM#13:41:23.34#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#04-Aug-2025#$ENDANALYSIS#0#$ENDDATA#57735#$ENDSTEXT#0#$ETIM#13:41:50.51#$FIL#CellCounts4L_AB_05-INF019-0-00_01.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#710#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#377#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#469#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#434#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#564#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#975#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#737#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1069#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#334#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#334#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#271701#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#352#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#412#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#304#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#217#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#257#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#218#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#303#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#461#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#320#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#359#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#1008#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#271#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#234#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#236#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#318#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#602#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#372#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#55#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#55#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#241#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#241#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#286#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1013#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#483#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#471#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#473#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#467#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#284#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#531#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#432#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#675#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#490#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#677#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#286#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#407#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#700#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#693#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#158#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#245#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#338#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#238#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#191#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#274#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#1022#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#524#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#243#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#616#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#506#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#661#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#514#$PAR#61#$PROJ#CellCounts4L_AB_05#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.47#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_05-INF019-0-00_01.fcs#FSC ASF#1.21#GROUPNAME#INF019-0#GUID#CellCounts4L_AB_05-INF019-0-00_01.fcs#LASER1ASF#1.09#LASER1DELAY#-19.525#LASER1NAME#Violet#LASER2ASF#1.14#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#20.15#LASER3NAME#Red#LASER4ASF#0.92#LASER4DELAY#40.725#LASER4NAME#UV#ORIGINALGUID#931f801f-77e4-4c4c-85f4-9ec001229fc5#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00_01#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#G~{C].@0CeXd^C[C&C LCb½pKv@TzCGQG'A=0BڒB C'VB`C9C qbB{' ϸCd£Cy/BڠC3GNG?BG6GCZC/\!\CDBdBJMk9CGtC\JC +Ca8a-´) 3BBRB~GA;C{ˉ2c>„m8Cx@CA%C +BK"CAR3BA{B؞C.GHGBC;P¿ALB]r&-@B,6C. G[5CG}Gf8GGӼ{BwWcB)D@D#QCÑA:1C''zBAVJ,B2JBB#¶LuIBfCB~AQCZG֭B&DcBPC DD'D]DDhsTCuB#CXRCˆC5HdHwDTD `DDqDxb>D"DDUDSE+DDhC'BjBC'EHI +MHHD !DQcDT7C8DY(C9D$JC|3 B+CÍk[CBD[!êCx1CdB eC5*C?3CGC) oB(Cv\nCZBCC'BA*8 +BstHPhH^,CEBCrlUCOC7C?Y!CVCsCA$§qoC7(B›7KGKGD9Hy+@ƾGH5HNTH`D$)OD)gD̸DBDU%DphC CkC0C<@u_ADEC6jB}BC%YCNcH!ޝo%C.CCǂC_RCOC-b+CA–eBqCOC&yB4`H6@HHHCg ADC uD1DDD*DK%DCdCCkBCB'Bt~H uH4H! H0Cm:{:C)D$D?D) CSD(LCCCoB#WB+,B+mCAʆ3CCFBGkôh[GAC$EBGC6BCD4tTDJD]FEXDlD &hCCVJCΒIHI;DD[ԽD-ND^$DEEgYG +GF:E!ErD&DDTCII)II4BD DM)Ev.HBGGZFtuF+8F*pEDmD0D%DyEBތC]C*tpBdCi3óR=Gl?rwDC>C*C~TD-)Dc"fDC.C +C{TCY8@B H67HD[3D%DWsDl#DΚDgDQD D4D<@D]D_D}yD]&DB.Aj}Ht,H H~cHCzvD GD3DDE5C˔D`DD7UD/2gCA,C-aB|CDXCrC؛CB_C`8NBDCH,\@B7CDBAICu0LD](DD) +DB.(D,D5jACQC|NnCC?ؖ“%HHfCD`DDDD'E^Eg1EZPE EbE7DQnCDCGꎀHQgH`H{DmDDD_مDUDnm)D$ZD<^D.RDBpCeCC-LCuKN?QzAC2CC-V JBCB¹DG#CJWnD2DyDoDkDlC~CxsC^hDQؑDiAH_I GH:/CJ&CL!C*=D#DrDO~C"mFBrC2tC^a?|CD[!Bg{;A2i +€L%H<CUWADKqBHmCpՊC8+B9C(\)C +ԊgdBAK,qBjBWHH#wÍC2DBosCtC)πCRnD~%C9HBfCAC8ABj{̢#CGɀGHUGHgbyáCec COD)D`ieD +9Cۙ\C$?CM(/FeD0%!?C C¢DiCC?C=A2;6.kHr>@bzô @C*CpmCYC`C*Cr|C 8Aet.jN_~bLB>"GNG6GGOB~ +C9C6C_C\=C(nCACFa|w/B`}<²v>'{C)U1ECC&L@}SBD^GxCpC$ȩCcbBDTCUCC+C/ݿ)BVåCEkAGSG-C4.&C)ʤNB|F>C͛2B0N$_3'CE™ңCLG%G}k]G@G3%CCmuD%CMxC)BCMOI1C$ËpfC:C$oCsý\B?}_CjG{B<#QDDCBQDDjDdgDf>Ch`+C-C%G1CQC\2uHH'DDyDDw +D'{DE *\EDDӼdDCrAD,4CԿgHI Hu HED WD^xBDx\D{DDD))C`-aDI %CLCGv_CڱD&RAqyLC\LBZGwFdCPlCH>O@iBwB/O²~e#=L…Hu@ìvCE DCDLݤDCɁDrJDDDF DDܦDCxC CHTDDiDEED"EEP_E E8D>D5C[HHDHgHB:DtD6DD6$Dm{DDwE9qD5CDRD DCHDHCD{wDH~f@6wC]Bwj"Cq H4πCsĘC^BCvCoD:C~D#HC!BO\C׶~CdO5CU"C +C&:wCмBQ@?dBCȮ̑Cd)Be sX C{HB,BH@B{CCRB﴿C)CC,0B^C(9jOG5Bwp5Ä.HFHgCD~jCw+C-C.)CtC5D C,BCc^CW>@Ƚ.dByŠǜGrGfoHdH$?[þ-$Ò +DAD&DIV×~C;CHBbCR8 .?B҄BABCLCJLhCTADSGCDDEY/UEoOFfFvF"kGFJE*[Dc)D-D0D4C狝IwXI,ED6E+E3EqptEHE;G5HG9vnG1F (sE{1E3#DGDwC(ICIwIBID7_D68EHHGF?F~FhhECE+mEDlDEoIEFDDDiDKD7+D#VHUZD-D;DNDwDE1~DD)CCSd f+CMC9ß`OC^\HBH2DqhDD[DܼDlDJ7Dh3DaND+DDCƹCCU^Dd7CIIX`IAJHHbD DiD`\D[FDaD*DCxAC~D-70". C0DgI.CkC3BR™ä}BF> YC`qBBbCC D[D7D~D%2D?gEo DBnCkC}8H.@HqC쒔D4CЅD,6D( DUϫDcOEeLD\FEv>EdE;mED"D?CIHxHeHjd@HDDED/D22=D0DV*DkDwDhSE >UDiCz!CbCGC?cC&D"D&D}yC:BD:GCzCQ¥jn BC zC~5C.CCD4C%BG IBJëÑGH HJrO*C@ÀIxBCBD3DxCCCCB@¢JB*BNHHH4 H8NCEsBhA8RBACjC+)A(B⭀CEXIjC;Cs*FCyC04{DPB`CGGhiCTC.iC"CD(^DnD_TDD+3D֘C<BCN¡C&ABBߟIpIC;DDkDCDr lD}gDCzE9D`G D&CQMï C4CHnHUIITs0yDIDfE +E4~.D)D&C!Cȿ` Aʪ8x(DBCO!__Buh[BC'G-D'sBCMD 3?9CHD$DfD=CQDϠD2(FCK}C^7CSH=HmDgCŬDbDDJsRDDDS0DiE=ۡEKENDܙD*fC'C+-HHanHl@HB-D&.'DDCVNCklDmDZkC#*10äDCMD6{QVjBCƇ[CCވC|GnLD)CEKE<{E +\E=\FL"IFcI{D2 DkDD8gDnDQkEALpGFבFEEbDWDyCBv IZII>IrD|©DEwH!GG8AFw|FWiFELE~?DCvDD}EDAbdGª@pCgÀ~lgF8xCn!mԜC'|CDDD?yD]CGClB_02CgTmBޯC@H H2DEEDDD6gDxDWDTDhZD՛DDrD{CnC+HvI8HY@HfCD/DO; +DC-C/JC{CgC!›DxBdCӥKCUC>CiC܀TC%ÀlC@5üH\T}{0CZ'Bصiy4AVA$A+Aڌt¯?]üChwCXBGZGjCMC CeCSfCAO'BBH*C(!BUCCb`CDG:3C(COXhoCsF+oCWHHpH 9DADDD +?dC CzCplC3CFKCCCCCzÎC;CaGfGG8H;XHAAfCChCCRCRB(B 0ChEBBC*C`CoBckvfA\B% UH=Cn2BaD`EE`ELEEG0/F#E".4DfZD(DRπByCKI*ISI5aIaFDBCrD:DҨ)D@D Eo@GB.GB$G`F{E^_EDZDZD1iICXIͨI4pI>~DVD/_EHSHkGFpFCFidE/E,E&05DǢDƹ3B?Cj D&xòg2iC +? GD7_CӠE7}6EVZFEtF ۵FxFFDEDBDYgD5DWHaD5)ChIIDbDaD֞E iEEEBE'GvFp=FEձE(D߆DCD2{D{IIQ|Is͠IsD@G*D?yEnHGG5FXF!eF[EE )D؜D4D`LJDD?3DUDGGD{dD.!D-C-H8AAܶCn QC5 Cy1BVCEBCp}šACB,CgGAG1G'9Bë,'B.C$ÝLC-C:D ~BAeC/C!yIc&`GJGyGmGM_j +A/B +=D7pDaÍ~CȆChB2gCnBLt]C +qCp}BAÅgA۴BBf]¬DA~GbNCM*C%BC`CI8-BKd\BC!}C{B&yBABi6CPGG*tACmDD-sDMDMD*TED3jDSD0DRCB⤷D:i;B$GvGٳHHD]7Cx.DQHD˲!DfCC_CBˇCCqB_CTC-q†4BnIDC٢CPiB@Aq,BcCĴCCIG)G'yG_Goh&Yf}BD]C5CDB +CS|CDB0MloCBBCC=rC&JBuGæCC79CBvC&[DEC$d{D>C;‰3C@jC^!Ï_$HSlH"CLC`DpDD r`DS4CUDs'DD oDICDBKC/eCCrG6GIH%HSwB?[C>D2{CgD7ɭ zCmCD OrYD $i,BrCA[™@~&>=%B=B(^ý?C)G2-E{ÆCtCJkC (CD|Co D%aC 6ѿcsAR·\ f%2GGG'CP@AC5CErj)C_QkC,R4ç,9FC$hC5C NB޷GǀGLH 1HByC;CCC?x;_-2> ' +ДBFP6CC£oB@C84B#CiGץE)CٓBC1aCq?CTWBtB^CBSB“"jkG`<Ga;-CcwB- C'CCC;SCZBĬFϔC:ŒWBQc GHG< Gj&Gi'Y©)C .BBCÑΫ?]C!BCխ1zBrpC`6C +H~@CiXÛCEC1BCCbC۟ACk +BWBdBOAA)x]GӀHC{Ĉ¡1DC3B/PCnCCC,[`zC0R‘p]GG}Hn@HC1'ClD#D1s3E9C^EBE@ Bu^ CgqY_B~&B# B CBB(hC/G3A'CDSYD8E@EEÃ1E4FE[DEcD/CJjCCCHϘ`IE?GFrGFFIEFZGFA)FE+E$yDD4D""IqI_]H]H6CV\DEH4'G*GC?FF%FAE|DuECZDÿ0ÉCU 0+bBkC{~C,}NHsAؼBpסBB\CBD_pD)ӅD^ZCCCCR>Cu'V3C@HkwH@CD,HDw"DDD ErE DDxD/OD,CѶnB}CKJCGlGؤGHnHD5VDR)DDD-CzCHPCEC+DCTD*PB FÀCQAٙBZ8DCYBUG*CIUBaB4B5CQAC~CÖCGB C(kBv gƒC"GHtBBBYCHq2@ì{@PfC—$CED +DJCk;D&CҍC¶B:3kB1Hè`H̬C `G•nSbnB>DSD%*D9Cj0C[PB'9A"BdKC}>cj?H&H-{FH*`HlXC*Dg`^B{DZDoDqC,"CwCClC˒NC1}¤.4RqeZC\R§;WHv@B@¦{a&C:XCDDC2DM+DnC9+;ÃmCCLHN(Hx#DlDDfCڊD{ 4DrD DBDʵDbboCӳCːBB]D,tVBBHI QH HADAt +DCͲD +DT DֶD6DICrCBCJrBA2D)5B +>C>A +=|z#CC5&D^HOA; BBy>sDCۑDTsDbDCCmCº3Au>ClCeH`H;D8_=D.D)dCXCMCʫC+EDDAEC蝽BCbN` 4TCD|0CUH @H [HH/…y >CDEEzDCmC`?BxNe¦taBLp@:CҸBn۴\Q#ÉY.=HdU@˄êB4i£@A†*CzC]Cˆb"TBF>C:j5GGCBÅ?|C`CHD#}CwCeCIC6|C$C4ޕ=kCRGG GGC CCaDZ?DjC'4ABB%ICұ¼2~hpBJ?BvDCрA/CH,®Bx!BHH@7a¢VqC•@~CKvBxCHC:%iA]iJ^ÿzǙcC IH@HB~CEC2C\RfB/]CuSA!Cg«C],CtCSC(6VC2GcGX6H%H.tBBCUD$/C3CC['Yi~/RCBCB5MCfC B0B3‹xlC6>GD*zC jޭCD#9DoCbDD^DB !DY0CÌ}CHCGHD>fDCHVCKD.DUHDDvDDuEmE:QEߡD׮D_;D8DOHH#GQH">C*)šqCH,HDdDƩDDqD6)DNDsDpDErDE sDLDtD?A,H IlHJHDD:D::D.D*CQDC:D D)@Dj;?CQCCbLCDD!6B |)BxBP|C5G1DCjaڛD02DhDpVOE1DͯHD&D9D]DoCtNCժC-êXH.HD2FDED$DKD gDVDwE MRE|ED\E>DDl :D@ H8IdKCH`&H4C~ +CٽC=DA`D5vDHkD/D' `DCIckҸD-"΍UBDCDGCBBD<5D@-HobGC[G'{T?rړCȆCT{`BhC +B%”]C,CjXByp3C4S ^ GDGFrG7HC1E9B'C#DXsDS0C:CZvJ]Bý0VutA˕CxClC`AÓBNC.BvC Úiar;G܂C,pA7C@¸C +C>CBl[sBV±eÆH@H8UkBCsC2/CYc @X£EsDLD z*Caku +HH)D?DbW6D{DyMDWvCDM {4'CsC3Y.6CD:{B!(# upBCCM~H:@´8{aCC>sD\ZvD>0CDD3DDt DCCsDCCC1HΩ HvDvGDnD;DaDIbDEYEkDENE&*E^D ~DBVCrCIRI +NHILvDD:Ds3DmDDbD83CkD>TC=9A +B0D#pB^C'C_rB)CCֲB3^D9¥Hb@B6C#Y™CGeCNCfuD)WCmMqCoCBԡvhMCpBD$C5AQH*@HsCn]DtDD(eDFD? DDrDuCDCD-tDC&BmGGrH6HCp0D)D7DWD rCNkfCqDORACBxMC!A?˕¬ CCdCzSB5CToBNC!;paFLG¾fCC!-CCxDD,f>CSD#IDzColCBm ^CqBHgHDhDc DDDD!DD;kD,DӟD!-CD"DxCAZXHfIHHt HRDDDq)DfDݮC^DL,C9KCCsC;UC"H6C81BgD؄CTcCڠAqCC +MCxWC=CFH$@Þe{$?qA˩CUCܥBCaͥB,B?j@BA‘v« KYGgTGigC!`3FCCҊRC#Yj?ϸBZ CzC^CedC;, DOP(C-*Ê5GFG:GGq /? ?DB¤ =Y/EzYWCkt\@'C5^ÔB@ŰBVC +>B*(ÚpBCAGAzGuy'$BaDDE E"EumEwEG Ff*E +DD;{CCC+>I+IY DDDfDǛDDʾE0G[GFcEFE<DqD}CuJC&Il0IKIICT/D~DuEH]GGvfF^FH|F5EE#DD"mDBCllC[øACC3zb&7§(kD:B&jd>7BYCfC< 8:BCYiC#jCX +])²fBBՖpGPG9bB2&_C 5CΊC($CRCNB)!D6ʣ@еBaC:§C)r*?GcG]HqH !ËYX)B<)DzD&mC(CUGICBÝA: DCYNbzBRÝChC? +BCOchDH/ BZB2Ǯ=CCOCx0C>D /\DECIoC C4  C+tH?@H_;FACaCIO4CC7D:D,ɓB4AJ,6 COoA2-pGG¤AH?HaByaB/1CU.DDOFC RCuC%%CicC.}C[J¤BcA$ƒKtB# !GB#`8fCuHD}-CD DŅE:uEt+E EGZFDKDCbDI?D*0C'I(0ITDgDJDHDe=DDjEgjGVG%HGeE>EGE$7DL$Do?D_I\III)CDE 3HVHGFnFlFTFOME0E4dEDCD +{Ø C%xžSO\C pHd IʨC*CKDbCuDDEE0{ErEDDȦCXD CDDmE~E$EEF9E 3D/(DxXCDCqCIFI$oDweUDRH6DBDDȺDSE.GvN-F ++FEcE;FDRD D]߳DxIQ0Iq#II&DDEqH\Gn&G(Fn$F FÊD$D?DC >CMBeBG•ƏÎNjGCbGB:Ə•C(FC[l®BD.-C8C>[NBGJCgBxB GKGNAhCNC B'¢CdIC|nD%CYwBBBhK. GÚs8G +GxH6HRLAi!GD-CA@C|C uC9CbCWS_kBMPB F!1 B@›BIoBGC}IC^sDiCjFD9CDM 3CϙD + C2CTdCBB4~HH\mD#DqXCD@C{4D>pD}D=IDD~DCBD^DWCSD>BktHy IϠHUBHD)c D7wCpD(DfDv:;D,Z&CBC<4A%TÀXA9BKB>=%D4Qu1B~OCCHJB+CFCBCC#=CCCCnBSCBBp.BB GG B@L C>DD/%BL< DjDaCB@CC5 +<ƕ3@Cw~CYGGj0GGA'fC|C6D}AfDb CSY:\w„8C ;BuAdjCeA%ê@D6f—WC)òÄA7HarC{DTEEoEAjEV:EFGm*EFnEv6DLWDD@wDX|CjC5bJ6JEyE~rEEbE[E`aEF|F>g^F0ZEgDD"Dc;Dq- DT@jC [InhI:J*JD6KDEfHGxyFcsFeEtE1TE7zDDl;DZDqCMAK'jCCBCQFGCCÉ$GCI;C]BIWH2B8C9CD{D`VCD +BC$^2mHCmjHN@H^D<5DHIDrcDZDDD=DaDD2D_`/DAChD([C:CMAHHHJH&D&kDnDDE:D@CңD0#@|nDd|Bkb[H/B9HЯDK@C#WAʯBYjsHnBGJC.!Cj CӇG7#AC@QDQ(D8CőC\DVCB_CuЫC_C|5+B|L BcH@H,IxC>#' +ىbCDECDzDBiD &C CcCX8C&O7A!#CS_Cq'HHͤHURH[[D6lC`D +D*hD;|[C1UC(CȬrBqDA>CC累CeC<1zCBhìLC@BjCH17@CgkCmhCTBmၘB; C`"Cd C6CpC'(pd<Г¶cGG0B 6CÞ#B ga^DBCECBBCfC%CsCC +D*DBRC|O$D_r^WHVkHMvCCvlCZDCZqAA D% C6BVN4+²LØVsC# GG9tGnG <CBCw{DhDbZW>B7r;+C5}CBv}z=³m8^2FCGSD DME5uESE`F(FF>GH}FPE^DwD1cDzsDGD +DˊDD'pCEӰY41CUC&PBbCDmD +D%FC'BdCyG#b2× HrXHDZ:DD DD{DEZD}DoE hD +DRfD CfD X}HZHNjHAID]>DsDJ>=DBnD\DC 1'C'xCQg.C pgCOkÞnC D|DÊCt[HB0DC`qNCh?DsB'pC]C•WBFhESDېCZCȾ_CCihCH`I%E7FhFDFeFYEUE0NGwGF +ES EhD?FDCy|DWD +'IgIHĩI PDCsE)aHYGGrٍF FAF06EIE2DDDiCF*B U^/0DCqrCtC+BD>kBB pC +CDB +^¬CFBh;GGϘ(bCé/C)8BuqCeC9D)D5OCÌп~B.yCp0H +@GOGGdD )A{-C1iBdDmCzB7èS3h/v{BkCH?Cl9qCY4C7D D6e/DÄDR{DLD>FBYC( +BBD,`4BG@H>kC_D(DYDR#uDf +DTKDDODD~C7RCҰ.CqY(DC0ACjb/I*PI}"H:H(CB5JDiD2DF)DmrtDENCDA#=xBiD/D5oPCvBLZCƔC1C@+xCGJ9&B#"aC7ѥBZTD 5B'C*A*C1fB6WY~vHAUØGCCaG`CQgCMC5DDRvEnE@rEWGF E DCD$tCqGDI/I"'DvDlDqDE9EEG>G@G$JF!CEaEP-E~ENDI^II)+I=éD~DEqH}1HhG\KF0FzFl+EdE> E5܅DEǘC64CZC9D,+\Af0DLhGKC/Dq:%EU(EEFB +FF^HGLF[RED?DqDhDdD+/IIEG@E~wE&E$EEp"F_HJ80GpGAFw\E(EEEDI*I$bIIѴqDŁD_F::HHtYH =1GBrF嗍F5FD`vEEkEGbEA)E6E<-E 9DW=D.7CD'D7GˀB!DD60D/EEEΌEGF% DDu)DA~D5C9[IMIsDueDBDƕeD4DǴDC`E^hrG%GGnGFEkEEDAD^VC~IQԐIq#IC Ib{D +qDlEHHG C%CVEAGWGPGoGzgDDEsgDQGz!F"D+=DCCJ'CLH˯IQ*Eh3`FlG0'uF +FmbFwFHGTѭG-TUFߟEp/kE:]DaDD1I"IGQH7 HќDœID];EH-HAá[2!8GSGOKC[݀. BC7pCf.BXgC{8C'Q¤%AWCj)CyGG~lGLGIȃCMkBA\CD/CBԣCYNC=-@P^M $~-GBlB&I-DC!H'ˀDa{DEjGEEFOlF0Fs)GqFEED=D*DOfD$k#IJMEZ EcEEEEr`E(H1GGcigFiZEeEk]E#8EDfIJ +IոIQ[DaDp F7HӀ#HPGvG/FuFFuEEdªE}EE?EjE$ǨE"DnDD +DVHH(CesCFdD6D~E +Es EEtQHFڝE +D{D(1DwCMC2,II>8D1D,DD1JD]DEq_GAGFF(E6 E/XEPDDz1DīIFRIiUH]IsDCDy Eg;HewGܛGfFFBTF4LE]EEWDFDDmÙCS6CC".CDQ^W¼H$¹8 Qo[C2DɹA)C$|UC\%B\CCB2ppGwH&CwqAlCCA+CgCYvfCD ?qCCHHBg~CGٸD +‚1AIc&0G:GGEH}CKQCRDHD{CKQ@2C&hBNt&W=CS®2 A2BjvBw/V@C]pŠC#O]69UH;CvCqDIC\DeDQEZEF0EgDCCCX\…C`H`ID(C;DD9GDD5E"ƕGFϋlFEiEW.DrGD~DICI4I9HI7D}DΕ9EVHLG~G-F}FFW&EtDַDlCDCBOBUCVH\D Rx>(BzWHHwCSZCDoE$E6/EF +ExbGWF\-tEduDD;!Da FD):XC IMIsfDsDDD,E%4E +E0HGhAG:dF:ENEc ?EE +]DyIO}IIIA@InNKE3%wDOeFXHmH))GٰG +DF\FԞF EIEjE yDY\BBD +$)=Cn$QCw!C +hGNCCDHDE# .EKEXElG7tF8?wE0Do Dj/CdDlCWI#VI>k +Dy&DDpE6]E `DQEXGG@KGFLEIEP*D}DlaC`IIII8sC|D_YE6HtHG~Fv"FIFrc6EԓEEAKE4eD՞DMõ4CQVByTCfCeco-BιB_GCYCT C_C"DKCD=(DbhE{wjD'D ZBCEC Cp:C\HIFmD%E7TEb,EA|E9DEaF4|EEaHDfDCCoCJC +XD1I[`IՇHI[}{DQ|Dq)FF@;6ERE LDODYD<$DmC,=Dc=D~C4D +D w¡HB +RC H,@A:NC]BmvC‹B[9C^/C4EMDDG!Do[B{CMOBG^HVWCxC6 ?CdfCVBj}DF~FE""D;DBŽB1C} GCpGGGЇGsDB^oD]GK> +F%FZhEb(EHB +E&Dk΀DD#C,ݤBlC-]ECp¼ͯh +Ak[vLG +fOOA#CA@oB#ClDG=DN>C[C;aCB*CB2APC_YHWmDYCDQD{@DDQDSC7=$yC:B4$C91HbvH}OHY{HtC`eCCEHD+BۢCoGCF/sEsVDD8#DD8DbDvE GGHz#G/FaEkLD=DHaDCIHImWH^@I QDID$3EEHHkG)OF|FF{JE;EUAD18EDC2BSßBaGGiֲC\&„ŜGb<A?CCC0Dt.BD{CB̞CxC7@Ϟ³yÎKn GHB䶈>RH6CKfC^CPCM(C;3HvG헇GFęF[%FA >EE/TDDDEE EPhEuE&5tDXDEVDǸHC `CֹD DFE 8EFE'lG9F3E D]JCW +DCC|[Cb[I6ZIgADȝxD EDEGEE˻HoGQG"F GEF#EDD֣Dv.DdaC +I#I:>H|0H$D)D%EBkGGwG vFHEEMXEkPDDoDF6DcCL~mD5D<&CfC|CwBDZQH^8|ôu@䙹BiahCBJ>C61C!C¤nW5<+$GcSGZ+B C77CTCHChBwD9C׃uC4qBdXACs+eCC1GGGGC~LCp6 P D9CBδ[Cg}BPCU@~xCxCr'CyC%n5hNHB!CCͳHcCAC&MB_=[$FCPiGGрGw0CmD7uCCWVCg‚oChDvDDRfCMC9jF6 DC15$CMG[G)GGBsB8BHD^/D^C5_C CO^Cu9C `PxCCúg>>@C +C)7¤’9HrBlsܙC:C'wDS DLLDOoDcmHD|rCRCQ!HNC>rmC{H/HōC&DHshDEEW;H4GG$FiEvFEzE GDDsD7CTWBSAwYBYwXD6JH'9&!CHAToCBECe3DuD-G/ѯF,صEQDC<CCC+/HI CCDD$DGD%EOG)G: Gu+F E[p?EgDADÊDRI6ISYH&H攞D4De^EǶH'H GlFfFqwuFiEࣜE-E 8DϩDC!DC3C.ACC9C]ŭDO#mAte;CT(CD sD:LCYhRDIAÇ=}CʓIChG}G*C CCCYCZr >CCD[D@pLD&BCz'e()My_C~GBGwwGGC')'CE^8DDQCȞCTCO^J^GCkMC$ʼnC,]B~$B\)BCpvi)"HuC)†{BB?C^C%\MC"YAB7C6ǝB?_C}é_CZGGeABvD +CbCC +BwCCCGCnCxC/kCb=̒JD;CG`GjG|G/CQBBT)C2yC_CiZiBh!CSVC@f‰`~HCB$BxA;# +CxhC.C"H?-`2jͱCZOCy6BRCUDuKCZ>D B|YC%dBq +AC@dFG߀GY0D ;Ù8B/]Cj}CeAhD"CgnCeKC,ۿC2µBGGGGGBC9@BD{5D5D!C +{CC9 "CVuB̴CCj\%ʆAJt>{\C<)ÿSé2 H D ;DS'E yELTE^EIFT`FGfpdFf%Eq8D0DLD,D kCT~I0IiE pEdET8EE7LE>E7H0cGӥGaF](E[ELEkEDjI`I-II֝D{DFHMBHSGG-FxFeF*EE]wEAE6qEE>#E0DV=D՗COD@e#DSb/GBtCm?ߋ%Cr7D/@\D+tCy@CPg"'Ch)IEAtHHQCaD7D{D +CQqD#C{BD3)CCSCr&CV]CrB]XHKZ@HLHw@DKJDaDDĜECE~E /E9G7F +E!D D DWCqCHIdÐIDŇRD| +E4+EtE4Y"EEBGzGFҍEdE"jE%+DǿbEDaIPI-XI]ID$DyxE._H6GKiGPЍFF!F&0EDDDs|DBtC`cUATC(C[OAtHtD/D@՘DDEU*LEEEqG'BF EDCKCDHǕCأTH9I+jD+D DDJcD Dҝ=EQIG2G'GRF{ELDYDUDKDIII bI'DVQD\E۫HG"G_sFφF`FYBEƺ Ec=DOESDCousCAsC06s%0BMC~CfԠGZ_}C=d؄S/ C"C|@D[E}8B^AVG C(CVGG6brCCAC3CjMC +CCLÍnBVVC? 1C~N)YBZCG܀GGGGBA;}BYD#oB7B.­@B35Cm^eCTCJ\@^C[C:=AɺnBD @F@DUDbWXDO|E6 EFE@>G'cNF*=HE0DcDy20D&?D1B|X|Hz IgDDyDD[^fDqDEq{$GG!MFdE% EK8`E D{D*ZCIIO'II7BD3uPDUEHa0GGFJFTbbFPeEā E0%AE8fDŁDȥC~BC4ܨ9=CnlCKDƉH§>+eYC=͕BRCC\5CM(B ?-ÎR‚ÅCBOGG/FCP`ۗhC>rBϚCCsCi.DeCC^A~C +:B +ߢC[/€%GhGx|GGQC+DD9/A53A[ '!BS@BpCCcSB)a^\)%SßkAo11H]CAC"GªeC5Cq+B:qCW.CMC4CC8BG C +G!G0®C"I¹#CC B̟C*CAaC\jB  xqӲA*5–PGhGb<G):G$&B>CC{L{D1DBCWCW/B00MGnuB9C%APC_C;C o@BeI&Íq U1HDCDC4gCk~CnC3BkBCDCyB >rm{GGWC}F-Cl=x BZٳC%'CaeDåB_BLhCCBrŠsCNt GG`G_Gׂ@Bb;B`ĎñQCUPC3BOB܀CG̽T4eCBCqv5kB33C&`CKGC%k)!H/}Ba¯OCӢϟBaCF%zCRD:sCqZAT]A] )G8H0CDXZC"J˜-2CJîDzD_C$BBF‡B?CC'4GˀGŽHH mD +C^²D{DDzDP'CCPCHvAkCXbBLCC'åB+C]pCB@”t(׊Q G$_BF7!CaICC,DO"7DD)DypCC bB}^BCktB1C?$CS3 ̺BBXC\H@CBCm+Dq0DR}EQEcE3cEG-WF.EDLDQFD&D)}CrI I)ΥD,$D"TD 2DEdD*EBG6GD4=G#`FwEYڌE4QDΐDDIw0IAII-pDEI[DD#Y:CęCܛI(ID.MNC{DKDDDBE_GƕG GnFE@EDDj-C(II=I<I=?DZD/E;HiS0GG FwFKxF8EE'*DYD,DC_)T˜\ØB"pA>s? GCeCߎDDE +EEE\G0JF)E lD؇DIqXDP"D +BH`Is`Di\DDD^DanDWDc\EyGG*zAG{FVE?*DpCD %DI^I#HI&DDhA*EH~G4GFUF]FPF,E]E +2EDUX4DbCC*#fC ½!oWEs}CxչžA̕CCCC!qCCJC+x0±FCnCgmCLGGCgaD $C;=¤CfnDD°CL.wD Cq0AeCZCyCCGG5tGCG̒BaCqD*[BCzECBo(C A]C]{onCmCa[B—x:x(^7i@߻7CAdGC3CsC\BʁBCD  )ChFC +&B`BO 3WC:.G2G⮽"C~B~ ¶ݦ?w@SC80D;CvC0B]{DJBG/sG[G}AQGUGZ`B9>¹T'CCfC쌟CIV[B0Aۧtîs=B9(BxqBB>=%_#,8Bh[H>l?C/M}bDHjBD>wDOE%g|E/3FrEDXCgCã}DSDD%H,`HۅLD4q8DnDD*D{DECIGTcF#FEE D@D]UDJ]KC'IF]`IhHHDwcDEH+GζGCF`FCFEmՖDCDrDp1Dh!4vB۬CBz"CB!;2ÊcH`|@ESEOF4FnF +G!GGNKG.FF Ex˕EFE7qEDĥJJGD YGUmGeЋGhFxFGGpG^fG@FEuEDE@UEE=(IJ@fQJJEEYDc/H/"CCNBChD$AD-DȟG }xFJE ưDX:{D+DDICBvC͜SHݮ@IDSJD|ODD2hDDEMKGޞgG0G FgE4ٱE%4DDcDׅI(IXwH`HKDr]D$Ej3H5HG^FFw FfkEכE1E7wWDOE3A%CkBJ4CQC0C )C¸v5HgBP…qCD,B0DeEIEZ E?e\G%ʒF#$E +D$1QC_BB+BH#I%D|$DÅDgDGE DEOHGlG<.`F.@Ej E;DDhZD8IQIQHBHFDZuDEO.H%/H-GGFeFEFEE?BE)qE,5CaB9CTo—}C!/C3G0BĘÀBBtC4FCіCCȤCm{CB =CCs¹>CB]?QH HZCIˆZôC9CeCҒDwC?FC8Iz HCRCm{qGG`|GGChC\DauCȿC FC +gcCifҘC|Ca/ðWa߀C 9_B֬V•BysBCYN}C"G9C~D8=Df3VD!EE]4EP[EfFʅED6Ci}CL3C!YCIúHIDpD?yDDDDENeG#jG +*FE&E>E,L ElD/CPI8IAII.2DADEkHZG)GpʃFF;hF8JE%EFE(GDӿDQDAnCs(C;ˆ{C"_C/{CFC[C)BcC=CkC%*DGDDEAy?:\ASC v圄CGG|CA+CbVSµdÄ- GlGzGG+j CkC8FL"EE(-DlD2rDLCiC6CDI‰gk^C3TCB_@~4HD CDRD#EEjF `EsG,F/E3MDgDJCC`DI1`I[7D74D2D>DEJ9DEmGG.mG +\FOE]DDDiD wI&IwIEItjBDD~5'E,H(TGGFIFjeAFWE|/E%(E3]DDݝBD grCycCAH)BŇNGCDC tBvC DCLTDfDᇅFEYD`DDDiC̈́D|I&IF&D`S$DVDDzD$EERJKG;F"F'E˿EL E*D vE'DHI0I<{IUyDzD[E_EH2AGp!GK5FpF*"F @mERVE1DaDD> +Ct$CthCǶB{\BuDCqDJ6GB\e}RC~ +CC?dCw\CBC!BߩÂCIBCGohGCDM`C;C]:D C/C:CCjCC]@ yNCAHCGjGG_4G_C`JCةD oC8BCƞCACGB';B<FnC G0:ƏCg1)BKqCu?)CODyCHC6qC+kuC£]BB CaZHstHuFC. sCЧIA"A!QBӽBD CѹC]9B4 +C@''BoGCM GygG{HiHnC9¬BRDDCUC#DB0~HrCl?C^N`ZcC6<7ØU\BỎBCФIyz}%DH~DGPE2|EʹF$UjFiFG1!FH GFR\EE7E]DbDIJ`XE#E +oF(FFFpxFgH[H*H GWFR-F E?ED BIJHIxJN]EEOF$MI;I5HxG9&GpGTmFF'*F EEEnEXgE0wEcEDD+DD5F<@BPBx)CBBCC)Cl C\0BbouCj`$Ac5H.f@H,C\yÄvCC@BKC;C.D @CYEC|]CBeCʘC|xAl]wAo5GGH1HC\Ux=oCĤCIgA}7BCVXC"}C(&o@J=e-^D*a4btCw1CHK–%2_:7±~gGʀC% %B:`BBߙB|Ž)CJDsBC GCClED"ED{DEKEEG)?F5E _DdD'CCDK+HI +&DCDD;6D]EHDhEf-}GGJ~4G$zFwEykE jDD$$C[;IHII +f I"uDzPD\E׺H'H4AGI FIFWF{VE4(E/E#Dr5E!CH{ÄCU>fBS["Ci>rHbCߔCQDF D[oDoEkLcEpE9Gs/F#SED4DjDUCBFIpI,i?DND|D$D`E6Dj+EIGRG:G3mFEpE-DD9DI~C0I]I`IDD7EH~H ,GFXFHF\EEG7EHnD 3DfCmnOBkB{CRC@#n[H;@C2Yy!DBJ CUCD~DbטC3DC5Ak @jBù`BpGHG@lC>\3[(C W BC/D_CvjB]\@BR{BjÀZC^0AB#gH ;H G1G>xBЖcBC3DJ D78C]GCCj@_CZd9#0?*B ɥBo{QB CQfIC^GiG$D%DE]EZF FdF]FgssG VDF"W!E=DDwaDCNCEI]I6DjxEE)EsEJ{DdEIOG9FIFE^DDeDD/ŒʀIdIItQIlDԷD\%EٟH&CGG,TFoLGF +%cE .EzJ>DtDѠDCCgB""NB^D2mõ~LB#-*EHACzDqE.FEEFF%F4GMcFOEVDZDȣDpD"4D,II_EE_|EiE5EnE7EݷcHkGR?G+vF@1E E>DR5D$IXI.IID*pDEHMH GtFFFBE2zEfdEsDrEEHEc؟EDD1DDUD`GC*BG1C~U"B#BŒCƌCCɅCB CW!3sªiB![1iG֓G hCPLÓC0`D >CpC"+C B@gC +B2cÞNK±CCO]tGGCH HLo[žQHDCQD) +C(COAGAkiæC}þ1¥BPbB33dËC-%H %¼iD#D\|RDDvEH=E0EOHFEDx2CBvDzmCwI&XICݤDgD"lDDDMDыCDN"EY87G|EFHFŮ!EE98D'DV_DZ1D_ IRIwr,I I)8_D)C/EfH7GGOFHF$FXEE S3DDy]DCdCVP +C Rh#C> +C0HDTnCu!DPDωE,+E>F >EdMG^AF[EG&DaDUDq%DyC)I,@IQ!DbeCfD[VD,/EzE*EdH +~G\G2pTF5sEEdEDDzGIIOI"@I@DxDEëHHEGGF!F{fF1EvZE&j9E.D̺C ¯9B\heC{\CS݇TšQCIlHuhCaBBQC9`PC/CuDODDQ%CvʔCaŠ C.JBg^BC6H<@HOA%fEC#QB"B9FjICvD@؄Z{B7D"B$C ԛC(DG1F6[=E`Di$D:DCj5Cr9HVI+D4zD3D+D&Dx|gDbvE]$HGT G)FEBnE$԰DKD#zgCYIEeIfII!kVCDDEFHSH GC=FFrFQxE?Ee5EETDElCx.C CCˆ{Bl1CCqH >ěË!1&$DbDDE[@E$EDD"D`DD\ CLCqJxxJE&FG nF6Fsm6F#FE"FQF" F] EEEDtDDfqIvIJ\VJD[D@7EYWG FF*iEWE[lE*4D}D aDI͖D&yDU%D.DaDx DD6DoD0A*CGDFDOcD^^EE/صEzF LE?FlEED{DEDd\fClFCIiPI/DrAD}E%ƢE&gEgxE=MEGFDF$ElE$rD QDabDCQIwII `II1D1D +EחHDGÂG\MFiF*FEUE6hDDDTACBC{C@C6i\@HUBBdBwb6fDҥD#DmC_CbgD!B +z}3BhECo7(CB/bÎBAfhBinCsrEB85WHiB-=dHB#CG~C;eC%:CNBXЗCFABðCgoCzCSGGnKCa}AԀCo=B%CGf’BCBҾca.<\FC,fBڌ@TCuٰG%GGGF C5{„fC/D*#C{iCE˳Ci[Bi|Bd +CC"`AzñMCñAC=BϻúXCH&CB,1Di(kDDEwyEEG=JF8E:FXD֡D-1pD&CkHbI CYDfDCDt+DqDsKEsHMGF}GFEY]"E:rD$D̩CIIIIzDD̗E]pH:HGݑF5'F/IFyEEEE$DTD[KWCɽ_D!PDHjDDƱSEDnE|یGmG/:G EVEHE_D*DӺDOI]I|IRI+PDD.EbH SGcG 4F7FY_tF]6En=E1oED#4DjICU+C1{3hzA~Dl BH_Á#!'QC°C\C|D?DgD4~CEBCWOrC )CH^HvCC{.CI0CmCD7DZVD=CC8?,BBԩWH,HN"3H)H, mDerC6{CQHEyesEKD_CC[D6JC:DCtNzL4ËQBoC`CZ3Bw?#!WH|¾ jC +iD +o D/D}E**ETEXĐFX+E-wDԐD9iDKA3D8CH3HzCrD;+DvyD|aDQDpD GFNF2FwECDJD(DjB2B+IhIPHF`IDD0E5G켧GcG%F6iE ,EC*E0DD8DD*ŗCAC{e>BqCOB1Cb00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_INF052_00.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_INF052_00.fcs new file mode 100644 index 0000000..9dfa197 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_INF052_00.fcs @@ -0,0 +1,65 @@ +FCS3.0 58 18368 18369 36368 0 0#$BEGINANALYSIS#0#$BEGINDATA#18369#$BEGINSTEXT#0#$BTIM#13:45:15.97#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#R0026#$DATATYPE#F#$DATE#25-Jul-2025#$ENDANALYSIS#0#$ENDDATA#36368#$ENDSTEXT#0#$ETIM#13:45:44.73#$FIL#CellCounts3L_AB_02-INF052-00.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#V7-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#449#$P11B#32#$P11E#0,0#$P11N#V8-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#807#$P12B#32#$P12E#0,0#$P12N#V9-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#652#$P13B#32#$P13E#0,0#$P13N#V10-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#512#$P14B#32#$P14E#0,0#$P14N#V11-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#399#$P15B#32#$P15E#0,0#$P15N#V12-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#344#$P16B#32#$P16E#0,0#$P16N#V13-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#352#$P17B#32#$P17E#0,0#$P17N#V14-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#549#$P18B#32#$P18E#0,0#$P18N#V15-A#$P18R#4194304#$P18TYPE#Raw_Fluorescence#$P18V#637#$P19B#32#$P19E#0,0#$P19N#V16-A#$P19R#4194304#$P19TYPE#Raw_Fluorescence#$P19V#562#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#287375#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#FSC-H#$P20R#4194304#$P20TYPE#Forward_Scatter#$P20V#49#$P21B#32#$P21E#0,0#$P21N#FSC-A#$P21R#4194304#$P21TYPE#Forward_Scatter#$P21V#49#$P22B#32#$P22E#0,0#$P22N#SSC-B-H#$P22R#4194304#$P22TYPE#Side_Scatter#$P22V#339#$P23B#32#$P23E#0,0#$P23N#SSC-B-A#$P23R#4194304#$P23TYPE#Side_Scatter#$P23V#339#$P24B#32#$P24E#0,0#$P24N#B1-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#682#$P25B#32#$P25E#0,0#$P25N#B2-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#400#$P26B#32#$P26E#0,0#$P26N#B3-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#421#$P27B#32#$P27E#0,0#$P27N#B4-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#406#$P28B#32#$P28E#0,0#$P28N#B5-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#343#$P29B#32#$P29E#0,0#$P29N#B6-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#249#$P2B#32#$P2E#0,0#$P2N#SSC-H#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#730#$P30B#32#$P30E#0,0#$P30N#B7-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#457#$P31B#32#$P31E#0,0#$P31N#B8-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#392#$P32B#32#$P32E#0,0#$P32N#B9-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#516#$P33B#32#$P33E#0,0#$P33N#B10-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#385#$P34B#32#$P34E#0,0#$P34N#B11-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#299#$P35B#32#$P35E#0,0#$P35N#B12-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#422#$P36B#32#$P36E#0,0#$P36N#B13-A#$P36R#4194304#$P36TYPE#Raw_Fluorescence#$P36V#490#$P37B#32#$P37E#0,0#$P37N#B14-A#$P37R#4194304#$P37TYPE#Raw_Fluorescence#$P37V#586#$P38B#32#$P38E#0,0#$P38N#R1-A#$P38R#4194304#$P38TYPE#Raw_Fluorescence#$P38V#230#$P39B#32#$P39E#0,0#$P39N#R2-A#$P39R#4194304#$P39TYPE#Raw_Fluorescence#$P39V#294#$P3B#32#$P3E#0,0#$P3N#SSC-A#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#730#$P40B#32#$P40E#0,0#$P40N#R3-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#372#$P41B#32#$P41E#0,0#$P41N#R4-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#348#$P42B#32#$P42E#0,0#$P42N#R5-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#352#$P43B#32#$P43E#0,0#$P43N#R6-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#364#$P44B#32#$P44E#0,0#$P44N#R7-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#851#$P45B#32#$P45E#0,0#$P45N#R8-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#418#$P4B#32#$P4E#0,0#$P4N#V1-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#370#$P5B#32#$P5E#0,0#$P5N#V2-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#384#$P6B#32#$P6E#0,0#$P6N#V3-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#487#$P7B#32#$P7E#0,0#$P7N#V4-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#295#$P8B#32#$P8E#0,0#$P8N#V5-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#381#$P9B#32#$P9E#0,0#$P9N#V6-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#335#$PAR#45#$PROJ#CellCounts3L_AB_02#$SPILLOVER#38,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.84#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts3L_AB_02-INF052-00.fcs#FSC ASF#1.1#GROUPNAME#INF052#GUID#CellCounts3L_AB_02-INF052-00.fcs#LASER1ASF#1.03#LASER1DELAY#-27.925#LASER1NAME#Violet#LASER2ASF#1.09#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#27.55#LASER3NAME#Red#ORIGINALGUID#f9a9038d-7246-4872-9c98-55a7406b08b8#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LIN#P21DISPLAY#LIN#P22DISPLAY#LIN#P23DISPLAY#LIN#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P4DISPLAY#LOG#P5DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#2#HUIhI]C%D0'DFD"%EиE/EE6E HEHDDAC%CCK?C:IIԐI$IoDRD#E&F-ZkEYE?D_8DDbCD߅)C2DB]mDD$FCpY}*v%BH H"H @HyCBæʎC"#4E +?wDHrDk>gCYC XCj}„MApCqC-PC H I.HàHJ\DلDǁE/qtEsKEyMDD7D;D'3D.ރD4fAYBD3@OC΢>CÕCé[CI-hBԧGHVHmCL¥9C_D=tCZCCDrDWDn(CC)ݡC4|C?CH +H M GGCCBCAE%D-Dʄ[DeyD'oBWP{mCBV7Bҭ¤}YÒPAO\B1CמCX/FH߀I)4CvD}aLD-XD-[`D{DE3 E֚E#EyD)Dw;DzxCPDd1H(0@HpOHu@ISDDJ^D99EDlDbDhلD!Dp";CzC5@CpfBÙCV>CCZ|'^~¤XCBAJCWIpH+ɀJxPJVQDDVDmeDADE +VE`0IKI0J +zD5DE9G;GFEElE~E-D+TDwCvDzDтDyeDODFfD-CD&Bs=GHSH犋D;DCD)CM@D +DDhEDE +mD# Dn +CCnC(CJI./IhMHI D,DDMDxDiD"DhBCpcCÀCD.BC"guCp>CSCD:4BTB5BµC;˜FIAK`IpXDd *DgDqfD@E\EsE]_EPWDGEdzDD}|CdC5HDPQ6CTIPIގhI1{IaDTDEEbGODD>DD$OnCe.DFeCStCt]vC?DZ2CyCkDHÍ $C:,ƒxHFIpI +C C CCC̄CcD+ĢG5vGRE(ECtD0DD}CHߠHކH:H?9CC[ EHk2vGGy.F3FI_*F+[(D`DycD>o Dt+FE%E9D/cDo;C C,C +B9EIQIOaIxqI4D#aCDG +fF@F 3EPjDdFELDKx#CB6"nC)CݺC.C#B3CCC>lC׵<@T[H!=Hfc@H`G5CmCzBe1 R&3C +cTCT7T-BZh +ɗ\`COHQH?tvHY Ht/wC:y{BйUCSf3ç)ÓC9mB>~r.B)BSa)ÔGAB +AˆBæF5~GxHH1CэC2*>DVHC%DBU?DqD+DqDG,C#CACC%BCx~7H¾HHπHC8BȒCcE:DxDZMC$XD.9C)>CpuBIB ArCNCBpAΡY8~gZˆFH#HOB/B(C^FD6[DD߸DDD-DFD8DD:2CCYTCNHHRH1H HDeCBDKD {C߄DbwD2D +D](4nBŒvC =CCn³;|)5CPrûBYAi;G﯀HRHBC{CmD 0lD7)DD/_EEYE%EDD }D;DA[C`IC;HKHH8BHgKD,D\DD?DDjD=C 'CD@A3CMC5C_B݃-BBxB|{B@±C1CHUwIWID|GDEsEEDE.b9GGFl\EvEǻDmD5D)D+۫I(@IAIXI DD>DXHEsvH-|GnG:.FTDFE`E}D<DD{%D8CD#D1D upDRkC<C…HHu5@HXD &C{D DDE|D*DrDDD{,DkD|ChUCCBCQI&+@IFA>HH!Cr?D`kDD\DC)iDZICeC"CCAC"NC;%C%99–YBfC< 'Ѩ8HkmH +\@HC37CXkvB#CAt_CLCC;CCA&vA)sAGGGGCg@d C)DsJ)Cq8P,FCBBCL>ÎAmxAfCh¼ӯ8UBBVÁDGHb@Hn|[DAۤCPB+CٯCq C"\CD!mD=+Es]EF[DkDPDR~DDqz|I=vIUuHaHD,$3Dhl7D DLDSZD{CC*cCOlvrC<@A¶\)C-?Bbw$%CjH^HIHHBïBHyCs:DD Cm'DsRDSC/]BrBCGBqC‹HHH @H LyCCC%CE0DmkCCCuCMC|9Ñ?5B$AoCf1,C6BBU$CߙCAGI>pI8D)юDxZDDD[DDoxEE(Ef6EfQhE҅E +-E3DuDcǠCCI$xI@II8DD 4DuEBE-/DDWDbwDwHB4QD@CEelCXDV0C;%C()CwC/PrD>C#d3HnHq2@HDK!kD\D1RD,DZӣDMDE",DQEeDdTDD1;D)OCL*H`HoHeHD,D)DdCDCDD9OC0DҜC1.CD3CS, CIeCtxDgBïpC¸{XAuBHgH%I\CvDUD@DC~CjVDRYGWF[F SEJiD>D3RD$pXDCdzuHNHPHyH2D XEkHG]G1FK@EE@XEOD DzHDD cCݴnCZIBQCDAږCC\HsGGWB*CS=CTCyBBAÖDlDMD#CuQhKCpZW@ρGQ'G>G0G]i-CWqE>EDhCD%gCCFCFBRwPBq`CjB`C[\BօŒ|ȾCUjGEH9HjYXČôUCv\CCC~WDaD*C}CP>$BclAEHKH|]H\HaË( R|C9DD׊D#@D D BB^:Ñ!K``Co:,C +CKCPSXQB H(H HACC@HXCh3\ICZCC{D7CB0KBPB9hCC'GɀGiH#1@H:NBzaP&B)DUDESLDOkCB@3C‘m}[nCzCDECrMCui]P@8C=ȍ^G/IpIIDERHBސD@LDMiDDwD\ D"uD>DѱD.DFu&}:D&C[SIOIwIICjDDCDoC.C3CA}dNBaCUB!ÉD&CmYӬD5C C N(DvBiHpI6I_D,BϊC[Co3CђD O ACQD;}CC\RC~D?@7a]H0 HI XITSBaB uJCkqDA`rC##CbCPžZqCҰAChCorBnãC(ȯCY#—sXH?xHzHH'CuvCp,zBW/C7CDDVD|=>D+WCND=CݩSC\ +CYCCDB^G]GHHD- D D&D,pD?mD/jCMnA!#CPSCB̍S7NkCt+:@ ALh| +;Y,uCGɎJc|JEߧE,E/oDE pDWE:F=F_=F(EtZD%+DTxDDCIaInJJv.Dm;DE\G{F1FtEQGEkPEMGD+D.XD\Dd2C/DD4eD%D#C拺C?CީDHHCHP|B %!CjCgCCC>]EhD!+CŽXAcCTB,K@ݜ6HHsH@H(<˧ôAqED$DcCD2CDaAÔQ˜9C65r?@ 0?B3C(B\AЇH #H HC&DERHDx[BrDDDDDDID[DD4D*ODD`D)I + I8LHnHC :Dz/D DD:DhD#BdC}C]¤C ICSzCSB XC6sBuCCwOJpCqTC8U6H[WHsKHC|D-U;DDD\CW|DNEDD[D@8D}CnDmB$CEBHHKZHMH CQC%DUEBܮD2D1dBoC D{CB;4BBD C02)DÀvCBC"BѨ¯6TGH@HD>;8C#8CIDDDiDtD*DDDZD DD7C/l¤Cd(HEրHHfHHD1şD7ڌDdMDvD!D D, DQCYB@C^C!C!CB C4a3B3C+CIOZC-CHn@I& IBD+8>D-DtDQD DmEtvHEGG|b7FIE&jE_HRE XDc$CnIpII.?IICƐDtkdF +r+HHgpGYG0uFˀF8FE9E@E.PE)A+\oA?rÃu C4C~(HyHHHjCK%sDCI CIDw +DE/'E-E&/EDhbFDDAD/kBcD'?G>G~HKHjD2D ID\D|\DD)=C(DA8Cx2CGkCgC<buBKѡB(C:DRCBy(>C7!H-,Io2pIDDzDSdDDVD +DiE>HuH2GfF3F@EE3'E<DJIR(IrI@,0Ie/D7E9FviI>+HHIGG!+G\F|E0ZEAE{ɾEpBNhC#C¥C]C^o~F I$IGn*G q8FF_EEEV{ELkû6tykC9CsuïxD!}b H^`HHB[4BغCEIC-Ch6CE}KEGEDsCCɉC C+Bo$H6HHOHb|BdB1C@RFAEݿ,ETz"D3ICG C^JÃCWOAzFCV:CA E1BRCCHC9HHUWHcl:BHWBCxCe›$BCE6DqDB!C1Cm(BQAAρG'GH<9HKÍI'IVDi.DGBCuDD#D +E9qEDEEhDCCCѶCxyDF +I}6I|I#IID DKE1E_BE+D/C2CBr#ÊgpCC#A\@CʮÕfCdnFCoWôlAƼFI~IęD=DXUDfDHBDDoE99F(FJF%vEDDDbDdzeD4>DgZUH~ҀHIQ8ID,:DE:GvF'FKEһEdwEMDFDsDO.`CftDFDh0Dh\DZ^Dn)DaC/hCD"H1IJJr{E,EVdmE=Er@EҎE7IF4GH˹HBh H +v4F`FCEE}EhĈDkIiI#IΨJVDIEF!IgHHt}GGCG.AF[BF)E:#E EEWEEk%EDLI@JI%J +3E{IEuF2pI֊I$HLGwGjGH F}F$Eu ExEFE;EqEEdvD DjDwHkiIIzDDDrDfތDPDnEr-FF$FmE%-DDwDt?D?54DvIDI3II=KD;fDE$sGWpFFjE{EHfEA_ODCfDCsDa/DQFDƬD2KCD'MCu#GG1H/HJCoCåCH +¬7D=EW +EkeDCUC7mB=.Cc7BeGGH: HQVCAcA\&C5HF&1YEX0E!$;DoDNCMCnxB:0@B:B4CÐB^&lX1FI0I%D]EEnE%3EmErFHH=HF/F4[EsE_E: D׽I0JIPIpeD5IE{ FIgHwHsGi GEPG,ZFF EɥSEvEyEѥ^EǻENmE4E):Dl2DADKGxG}G8C|VC|X"BY.D+\D0jDBjC0D-iCHBB)GGuGyfGCn@C~D:1C!Cq=CTCBQA.S CyCU̎B_9 C8LeC% {C5CbÂDn'G.HNHcDMyDSDPCrDfD(ZDY2E(DDDkrDCL%D2#D KhCyI9a@IVHk@H²C?DE:6#DʼnDDnD8;DwC{C1C80ÿGFPH@H8B6bCpBQCFCD~ND*sDF"@HEH=CÿDDnGDD buD3D=DޅErEE DD.DoD*‹wC8CuD!CC}CDPA 4CytBGC+B,DPcÚ)GAGzGoCBC6L3ÉQ.B3C*Sc *D=mCYC%_Cer`Th@T_U@Gi~GMGfG¨BG`C D DDD)C@B>BLBSBbw-@!“LnBFdB@C8 +E±ÇbBA2GwHOHCfI{D@DD?E vE%E2EEIEe'DDX2C6C wCC9GHH]HwDD E!E-ZDDJD_}CD0!4CACB*{`CKBCFN;CCCeCAiH@IbpIDWDLDY DjRkDօDLDFqFnE=E5DD3D- +xDӿ@HJHWI*0Ic$C=D\+RD$G<̓FFFME{E$E(DtDtLC9,@DbDnD0(ND"$D3ΏD( RC*CҦrDDH^I@IcCClAD)}D% +DEE*zdDэDCDk>DDA_ DªImHIC!I)IL]DDxD4EDJD]DxCnC'X@CCf2CnD +C;p>D/ +éCOBL@4~FHHVD,bzD+[DXwDD{D03D܈DE3SEO%DDDgDD.YByCz(dCAHA`IGH(oHi_kDUDQVD:E0DDwD+D4?D, Cq CԏBaOCCÀC=C"ˆÖ{\,Bx' DHe@H)H" cBiBżB{}AY˜C%CCF CvO8BXÏگ,|LC1HqH (H-VH# +ªtC=jkC3RDkCTC(pAIIDGDDCs_C˲G3GaHI gDc3D DpvDtFDqLD7D4CCQaDaDBqCW_C{E=CآCwC\C_CIB=C {C=CAGG`GmCDbGD&7C=CɕAC½|CCpC¹BI`BdGC*A&Y`AGGԀGGVG_›x[CytEҥÉBbCZnUB;Ä1 +BßC\C C;@Cf‡\ ƒBHoHFa@H9DDTs?D4}D%^DNWD"DED˔D|DDD/D4CfDgGDHyH~H|HDmZ|DDVcE5DDbCED7C@HC_2HCStB@D +9sԕűNLRCBPjCmGrhINw Ic6Cɗ=tC.D^`D!C$D#G0F)FZE1:RDD8D7CEGCCgIM@I L7I5ICC5CSEi'GXjGDqFΌ-F EnE@EQVDk"TD,dD7DG^eCgACBA[țC +BHzI;pIUǀC)DC$ CD#DnhE:HJGo6G,F EvED~DBJI0рI8FIm I(DQDG8!DBE߅0HzH  +G+FeFFlEޣ^E>]E4EDߥDD]puD4B˅CC/è8+HwG0H1D YCAD,CADaC_D YEHDyD#DODǵD;fB B$jDH7HaLGH!C>DGDpD*NDTD +PC6C4?D*RnBtByC6"YžCDBRBVQõwB@ +G< I +IxDVCDX]D,@DcD +DXDD0DC)DICnFCǗB\CsI(IuI"I34DD4D[DRDDCD/QCDC?fC`AICe@SBC*Br@BvCwVDCzGiIyIҹDD\DtDE+FE/EmElE2gE*D>DmDmD!D*MCDIJ6oIlPICDDNvEJE`D֥DGDi +ChC CWeD$eCCo2xCACB\CeCEZ¸i;Hc@GGCBD C4YCBgDKDDD1DC&CMCCBRGQ +G: kGGٙ)CY1CirDPCDCOCpB=HCNBE4ZBH$BKC7_B[B;CLqeC2o°`B;C{b C3iHH.@HCQqC9WuFBCCl5.DkDuD`TBhpCxB{!CJY49KGoGYE]H (H C3mPC!tBEgE)DD%CC{@B-JC\Bc|B..C'B?BUo\BK6BW9C BNH1IW`IrD-H2DI D`yDD3CE9~H')GGQF76E;E<ZDDpD-MII)iIQ4If DVB ACJQZCOCyB[1~WFQ EKCK}C_H +@GMG;0B |Cq5D~)CCC:CDƈD+AD8FC~ٙ='D8C޻Û'BqHG7GGGaCâWvBE]DDwpBOhC,nGyC-CRw[{CCD +Bo\C*yBRB0GhH%H)DD7MkD&ND:]D6fDyDtiE++DVDݶDTDHD *CCn +IcPI2&H>`H C[D-`E D`D@CĕCMCUBACBԾC$C!CC;#;CIp·CB³ pG=6I VIbC⪊C߻D)Ch ChDG;D6G0&FFWDEWDMDŖDHC5,CI.`IRHBI>zD`HCdE =GsGEF֑eFh{EtE E +Dm,D;DATDWBgrC9[C-CC|Cn+-C_5C?GlHTH:C{D0CL߳C9DmDYDEj>DKD(YC_CC6BP:C@D2H I~HH5CCDS[D$D(MCrjFUCgJB @jCʔ[HC66BCvÍ~=D՜Y{A%!HIIwIATDD\qCDApD@ǭD=pDDD۶DDD(D-DCCtC5II#IpIDzD[D<Dk/>C%Qgó{DwC֠C_C-Õ9B[OC?CwC(~B<6=C-B9H;GGCFCFDDC3VD*,DaDI@DDrDE"DKhA~4CiC%C/B玷GhGG̀GC}D!DuD]DGeDlDWB&dDCk APC CBATBC0C=BwB`ÌFCx_kC8H|E@H5@H@]rBtC3C(ACC `R8hH H}H5,Џz?BUR>CpCuCĐDؚDIDB mCw~C-+DABPkA.GGUwHmHocC]E,|^D RD+D CDC6үl&zC/@>RCÁ8?R0"C4"Aɝ3GpI2JIJD#D-:CkD0rmD=Dy,ESHiG_G^F[E;]EEnDDBATIghInI$FI:D+DY9FKUI'5HtZH0\G{(8G FIFoEl!EJEJEI q­PöCmCVC=FQyÙhC@;H\HSHVCDNDRCeD#GD:Dd*D:Dj_ODOD"C,+C 3CWCCOGCGH!Hs"lCDD_D?D|eD C!C/ DSCB{C/„;-ºYCS4/CRJC'RL B(XaBCHg!"GIIIs]0D=.DLD4DzD=D%E[HeG*TGSYFuEOEID隻DJDpII8I3;IWDLD+F;IHXHGf2F&=FFEEENEAK,E-CWA(C>(C<Å£9; <ÂSCGsGvGovC;ÄJ.C_C +CmCUD(DDK$DcCC82VC/PC>CGP>GH.Gj9G^\C%_X wBnDCM4CنB{;BCRC8CtԏBBTCjC@4&B< ƅBaHJI<`PIXC}BD/ڲC8DBDj^Eu(jH~mGnHGFEVEE8?D[VCcIw +0ICI_I7 D}DOF9I5HHzGgFEF2FHE2EC>EPsEDDnyD\iCxFSC1CtCC@nH@H`HDxD0oDMDB2Do.Doe]DqEDDDqD\CBLD#DFB0mIPI*FHHן>D$5CoDd)DDҢDZHD%CB.@QCBZCYCDh uۉCCBPjïןHvFFC$y$CWQCG{;gCE DW(CeUEyC7M” ܫkBC)GGGB@FF|RCk֤7CY]DsDqj[CCM9Bӝn*۲q¾^?\~PyB(¸hB$6C.*=C¡+KC GwIJD9DBgDoD$DԫDE5FF/'rF tE4qfDDPCǏD+DI;&I]IhJ}D0yD{E1Ga\F߃Fz(>E%E_EBWDTDMD9*CDf C%C$Ca7D)^)Ct'CX D rC0GvH7HDI oDBBVDD gDDE'E MDڼE ̒DtDGCD#CDBnI=IPHH.-DXܕDQ*D̹bDlSDDD =C{DN8A`B:A(3BCCC6B0BCXqXŸpCm2QF|H.PHN`DDxCPPD#+PCDV +DIDDoDήDfDCD6KBюC3CC VH囀I!H45HV3Di#D@^D\D D`D9CChDC$D 3Dw*Cu.d-CC,\xCX+FHXHTwCrсCWRC駁C=ICuCa+vCtDCD,CkB*HTHJHVGHR6Cj^@гDE2:DDzK3C[B?CBy00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_ND050_02.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_ND050_02.fcs new file mode 100644 index 0000000..a5243d0 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target/CellCounts3L_AB_02_ND050_02.fcs @@ -0,0 +1,69 @@ +FCS3.0 58 18364 18365 36364 0 0#$BEGINANALYSIS#0#$BEGINDATA#18365#$BEGINSTEXT#0#$BTIM#13:54:19.09#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#R0026#$DATATYPE#F#$DATE#25-Jul-2025#$ENDANALYSIS#0#$ENDDATA#36364#$ENDSTEXT#0#$ETIM#13:54:47.58#$FIL#CellCounts3L_AB_02-ND050-02.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#V7-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#449#$P11B#32#$P11E#0,0#$P11N#V8-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#807#$P12B#32#$P12E#0,0#$P12N#V9-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#652#$P13B#32#$P13E#0,0#$P13N#V10-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#512#$P14B#32#$P14E#0,0#$P14N#V11-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#399#$P15B#32#$P15E#0,0#$P15N#V12-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#344#$P16B#32#$P16E#0,0#$P16N#V13-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#352#$P17B#32#$P17E#0,0#$P17N#V14-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#549#$P18B#32#$P18E#0,0#$P18N#V15-A#$P18R#4194304#$P18TYPE#Raw_Fluorescence#$P18V#637#$P19B#32#$P19E#0,0#$P19N#V16-A#$P19R#4194304#$P19TYPE#Raw_Fluorescence#$P19V#562#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#285071#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#FSC-H#$P20R#4194304#$P20TYPE#Forward_Scatter#$P20V#49#$P21B#32#$P21E#0,0#$P21N#FSC-A#$P21R#4194304#$P21TYPE#Forward_Scatter#$P21V#49#$P22B#32#$P22E#0,0#$P22N#SSC-B-H#$P22R#4194304#$P22TYPE#Side_Scatter#$P22V#339#$P23B#32#$P23E#0,0#$P23N#SSC-B-A#$P23R#4194304#$P23TYPE#Side_Scatter#$P23V#339#$P24B#32#$P24E#0,0#$P24N#B1-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#682#$P25B#32#$P25E#0,0#$P25N#B2-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#400#$P26B#32#$P26E#0,0#$P26N#B3-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#421#$P27B#32#$P27E#0,0#$P27N#B4-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#406#$P28B#32#$P28E#0,0#$P28N#B5-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#343#$P29B#32#$P29E#0,0#$P29N#B6-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#249#$P2B#32#$P2E#0,0#$P2N#SSC-H#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#730#$P30B#32#$P30E#0,0#$P30N#B7-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#457#$P31B#32#$P31E#0,0#$P31N#B8-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#392#$P32B#32#$P32E#0,0#$P32N#B9-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#516#$P33B#32#$P33E#0,0#$P33N#B10-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#385#$P34B#32#$P34E#0,0#$P34N#B11-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#299#$P35B#32#$P35E#0,0#$P35N#B12-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#422#$P36B#32#$P36E#0,0#$P36N#B13-A#$P36R#4194304#$P36TYPE#Raw_Fluorescence#$P36V#490#$P37B#32#$P37E#0,0#$P37N#B14-A#$P37R#4194304#$P37TYPE#Raw_Fluorescence#$P37V#586#$P38B#32#$P38E#0,0#$P38N#R1-A#$P38R#4194304#$P38TYPE#Raw_Fluorescence#$P38V#230#$P39B#32#$P39E#0,0#$P39N#R2-A#$P39R#4194304#$P39TYPE#Raw_Fluorescence#$P39V#294#$P3B#32#$P3E#0,0#$P3N#SSC-A#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#730#$P40B#32#$P40E#0,0#$P40N#R3-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#372#$P41B#32#$P41E#0,0#$P41N#R4-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#348#$P42B#32#$P42E#0,0#$P42N#R5-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#352#$P43B#32#$P43E#0,0#$P43N#R6-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#364#$P44B#32#$P44E#0,0#$P44N#R7-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#851#$P45B#32#$P45E#0,0#$P45N#R8-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#418#$P4B#32#$P4E#0,0#$P4N#V1-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#370#$P5B#32#$P5E#0,0#$P5N#V2-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#384#$P6B#32#$P6E#0,0#$P6N#V3-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#487#$P7B#32#$P7E#0,0#$P7N#V4-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#295#$P8B#32#$P8E#0,0#$P8N#V5-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#381#$P9B#32#$P9E#0,0#$P9N#V6-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#335#$PAR#45#$PROJ#CellCounts3L_AB_02#$SPILLOVER#38,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.61#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts3L_AB_02-ND050-02.fcs#FSC ASF#1.1#GROUPNAME#ND050#GUID#CellCounts3L_AB_02-ND050-02.fcs#LASER1ASF#1.03#LASER1DELAY#-27.925#LASER1NAME#Violet#LASER2ASF#1.09#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#27.55#LASER3NAME#Red#ORIGINALGUID#341265b1-fc61-449c-b286-3e2cd0945538#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LIN#P21DISPLAY#LIN#P22DISPLAY#LIN#P23DISPLAY#LIN#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P4DISPLAY#LOG#P5DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#02#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#2#HIILA C̙D/D @C]CNDVFF^F)ECDAD7D5C`EC3]H@sHDH HƠCDbG?GFU*EcIEeE[DD!IDbCG&CJ-DKD2DCpCf/CMKHC}VrHhSIUpI4ýCJD5DC_D()D#QDE}:DbDLCD3CN+ B~qfCCڎHH7H`IBHC:D/HEi"ER(DD{uD1D7”OA]C iCQTMB^COD7VCHC`貽C˃DgĿ H:dH RH?C(C{‚͖B'qC¶D9CJCJBGBյB A\nGـG4G6GBFª +C]DFD,CMBBvBbA+fCOãC.rB_4AC`E%Bk[0Bs8ÏBcDH@IMI ҭDDM;fD C3RCfCICs9DDDCCwCBbFW$F"EEQDD-A BCmC^[6j2AͯC7QCTCLCשBo>2HG7G#BCC*KCcB\BHBŊD4@D.CHB]¤'BH - C-GG̪GGIBABBDDdD-ךD ;C,CG¹ÐCG |AjCV2BH®ûHG@G܀G:B?'BœAoZ]Be,BXFCDe!QCa]D CCB–T_CDCgG+GG݀GfCBZŒURC/4D`DFC +BC{C`BC[CYxCC!|C iKA_AYB\%A6TH:@I3I]UD|[E^DwDTDڃLDwE[zHDFH9VH*JF/FbcFE"FH+H GFEFEE=D¡D~ ILItI I"DZXD`FF\I-|HH8GGG+F{fCExAQ 57CCb%H @HH +zHF!CBEDyD*Dl6A +CgcpB!fBDQC#ñDBBA@~B{BI^mBwCXFNII$DiCD DD9D +LD>NE̳ZH'HFjHFF:&EtEpDDu, +III `I*VDU](DtFpIsH$tHNGJGN,G,&FwFEvE/EP\COB}AȗCC%wCCC1FHȀINCPCD9D/DQpDGEHaH(G=PF%F?&EJEGŃE#>3DpII%I I D$D-FwIMH wHX[PG AG,CG3FENEfEEm8CÄBCCn7CUC1B"}HLH +HC`C"l_;nC7CbfC4@wBDHF#CWCC /Bv*ċCmI­bHGCHvH B_C4`D(D̵ DZCVCCBdC_ CQZUAÕ_#Cd:Ƌ Cp@RtC2g0CHH~H6QC㩑BCC]CDѺfDYiD@Hn?C*`9_dDQC>HH;SG﵀H +uC:oBߓ+CR ELD/Dd]CiCC;A4QÈGO6{<.C`]S†k./kCczCCnBG +BHHF@H$ChC.wAAlB/D/C՚D%EPEIlE@CCDC/CC2DQ6G G0HH#)C7(fbC¢F\pTE`Ec,DD DaBCC a D`B89Óó$By>TEGGG%BA!LBQUC,A8C3KlC@`G~ JC-CBAeCSCg>!GLLGI(GLGaxWECivD نCUzCl^XPB&B{"hi?E6C3BA Vv?‘c`N5DytC^HDI0ID2nD.CD3]DDSEHHGFFiE\`E?eDCDI5pIkH I QDKfD]FvI@HHK*GYG"9G +zKF{E(E0ERE~ANCCa6˜\ASDMCCCn)Lc=BE+C+]ƅHr@HCHrCtTgACa*D8 C4@CBsD P;[BCGdB!6C3ACD}|H9@H1f\H H|nžVABKCCGCUÆ COXCBd }C%CCw5ILiA¤CNC}B GIMIDI%DeD*FD|EiE + E]HxH>GԭFEnF E$ME@gE4DܼIxI%I=IlD7 QDY Fq˽IEaHÚHPGoG+G0FОECEEvE{{B_D36ÛkC!1CC(z GXJ)"XJRDܭE}E2E#ذE)E*EGG xFlE˄E@*D1D^DDFŻIDIU=]JWhJ0pD9DRE ZH(ɹGlG3њFvFFEw*QD;DƢDH4D + CUD'2DDC\D(*BD#AHmIPI2EDRD&=D7DņDD9EHH +GFYF:EEBEEDzvIIII*piDHD=Fn+I7[HHBYG?zGGFhEGEEGe}EYYeCb BC?CkC8CCrHw@H\H'QCk@D,"B&DG=D=D'FāFCxCnaCY# +Br CwD;ۘwDCtš)CC*8BfGGqyGGC84VA#2DmSC$*CCTe@Ax'C?JC}B;4CqC_~YCmB1,CF;C +bCKBšCH:@Ir0IblDzDVDDﲮD.E[E͠HWH:HBFߘF1LJE]|EsE:=DIHIrIR0I~ +D0Dy_FlIsH HHGb_GKG8BZFF +ExEiEhrtCeCsCAgCG= +G*G[C52ƒINB_WÎ +C +CCmD/3C DZ`=BlCpC[ HXH HC:4CCB69C;=A6CJEbDDL)CQ&CCAsr֌&b H`Hy]H]8Hc0B@v@pgB1EtEDD=D[#C?ÕnBnR0КChiBCAl+y[COBm,CPCCwOGНGGsAArf*Br{C<B%C@=<EO4D5DgC^Cm^C8G^CLJqC wAkqGG~GgGzCg?BڮC{E E_ED".DDCC(T\@ARAPCACBpX.eEGMH@@HGCWAѿWA)„MBwBD7QDDC[Cɯ82CnAߋCtNG'GGqG,r.ä;DLDC[sC1.CCJ_ZC+2EC[;B. +m f p>7zC E;6F~I5 I6C$D?nDD2ZDDE5HYVHGړF0FtEHbEeE?EIrIgIxI3D8EmSFtIJ!cH +HSRG%G-Z[G^F=EEE=Ea%B B+'wPCduB C3,)G I IC~C+DDDDV4EԑHHaGF.FE‹E_EihDI II +I GADƏDs FIVHҐ@HbGG7 GF]EoE_EʖEFCBC(CG3CiCCO1Hq#HH5.fCNՒCCoCDNC=CC/A#ۣCnlfB&C#>XH5HHm@H=?5CYiB&\ChC7CunC W +CBÇTRGaC~CBB!@LC7<=Å[BwsC,C@FC\ߥCKCBC.-CD6D3D\CLBRB B/7CC~HkHi׈Hy3HBz@AnC/*lCC3xGc4{BI!3CC +bhHrрI.xI.DDzD(D$D=D\FnIH H@dG ZFcF#%EvEy`DI*Iԥ@II8E T*EFiI+BI:RHH GGJVF$FVHFF1EWCgIùC;\{BcD6BEGKHHC=C2b0R#CB~I,CY¾ CÆ,\B%9Hu6@HpH`HdcѰB4ÂȕC~ACdCDXC2B*YBC67ÄCIBEBӗLtC c"'οБ!CGU{GI֍J 8D`EE EeEEQ FUH#HOGKbFFE0EV;EFrD.IJIIiD;DF{ԙI9wH7HBGbG GGFEvEwEleEr{ETE3EgESEb/D EDtGUJJFa2GGpG H+sHHkHw`H0H*GG#GG4FiFAI)JJ@jlJG:oGnG]rHJbHGSGVG GE,FKFNFF?FFLPEFF +#EVEDE0EEA9HVI`IUD +E#ZEjE<]E\EVF)HPHcH#k9GFcd F +EEl+DPIŷxI;I I2EDrqFI;$IKTHGǕG`ԕGAFy +EFEhqEEEwEoRqE3EAٴD.D#DGIBIbE+Dj/D8DVDPD pDE*Hؾ/H?bHH +$F[PF?EBE#E;DzIIII/`IFTD"DJFTIy}H~H G+G\`GBxF$FVwEEǗEϲAwCeCLQG=CodC)BCCFI4IDICDGD`sDęD2E|H?WHGF8F]EED5aDߛDKI;IHlID?DgFtuIDȪHHOGG'G>FEַE)EEhCK D !)A4.CCV%CH6I5I+jD#D|nDMDDDqEHsH%sG FpFqEʑEuEGD%9IpIPI"I<,!DI}DFIRtHH]GTG,CG1FCE]EqE7Ea.B΢>B?~CCCA0 bHeI=IWsDoǮCJ.DX3D{D)DCTEƠHҧH8HFBF2EvQEnEbeDmI II&JI;9DpDFI{HHBJG;GWbG=FFLEE!Er"B/8c% {åCDiClG.GҭGGaBBCΟ?BoBABbCx\@bBS?qCNlwGRG~`GýGTÔFB CD|C<9 CUkC%drBIgWY*ACrP@.igAuB#ÓwUCGIH\sHSXABCæCg C4C JB :DJD{C?B^!AA> kCuGG0HTHyAp]BCEEOD:D' +ClKDNC܅ARCBۭ5`gÖߚBy#zl>8Cv#BNY(h;CeCGӀH7 HCH5Bu/C;DB(C'}CJA@Bl"tCDslBveUC#C/ClWHHzWH`H@AEC-qC\DnD…ÆB.XÿԀ8IB _CsCš[2#O\*eYB,AH2GG#B5ϋC®CN@€C%CC''VC^MsÉCC/GHGEG[GC®&r9HDC˯hCAߌJcB^{B}jCE^ĆM@B~C$?Ëřw +CKqBC&GwHD@I;DT>C̢DPDDDEQH%G G&FTEJkEvEEW6EaC!Ll{QaCќ)C0QAϬGnHH&+TBwDA +CC=GBAfjzCCAOFkCXCtC;B} Anl 5GGAGC@BzdB''C]Cc:D3CD{CBBQ}.qBٻCG]G}TGG;Wº2BRDL0DSCβ"*,QSVübK-C\bCA^A`¬OҀC2TCC?Ht@IrhIDDEE=EjCu"-_¡B۸H`H-H.@HSCvoCZ<@yVgCQ7C{ICBi¤W09,CCC^H1BCDC]CJ+CA籲C G +IJ@`IvzDDBDDE!DFLI Hy1FE[Eo'C|/B iOUmBÅmC +pGI5nPIElCCpBDDCufD'E?Ht"GРGŖFqEޙEuE=EDI"III"8uDODF4_I!XH3H GYFreF|4FGEZEm|E/E2jDPDD=CĤCCDCO*Da1HIz@I)DDśE,EkEpDHEH1kG_G]aiF2E~EM0DDzqBD}I(J {IRIDbD_FxH@HTĥGyG% NF"FF2EjEMUEE j\wC%so\CKv"CPKUCKBGπHрICłD{:AD D8DD?fD'DGF42FG wE4rkD ^C$C$Cc BIpIH#ID#gCS6DG}G(aFEEErD3D"C&C/D<\Cp=/'Q LaCN{*CG7G^GCfrAޱBtwfCwCB{#gD SC(cCBI8CVZiLABS#G{GcQGqhGkC@CrC^xEUMDwuD;'C5yCC,A5|B5QIBO:NjC6@{ŠBl~?tCHHCUIB_HuʀGùG.BmCR CNC73C/C>TD`DD`D%mCBCmAPxCޖGG~GG{}#mg >D}eDtCCBB=שC[*]pX^ilÇCy#CHCJA5CgvAHGGFB6!CCGƒkC3YNC;DcCC6A4 /p>€}*%.zGq^GcGmGgC)XCHD&iD)CC½CXC]B8>ž1AYC +R®@­yhl #S ^)B*m¡? B=GcI>`J"DF\E4t9E:֔ECDŽE^+E_F$~uHdHHXHFFFF ,EBEEv7D I*J I&`JDEF9IIFHGn'Gi'0GJ%HF5F#EvEVEO9EkE= +EfkEEHE +!;DGD+vCFIHH*H2BS6z?BX7A6CmpCLC4 EF!DߤKD5C)C9CCeMCdA(8GGH4H5k C‹P0TC-F;EEoDXD ޭD:Cw$B +Ye,{%BMØòQC}wCU@}u+H~܀IАIOAD;KDIDD E+v{EEESHH/dGrmF&WFR_EgE1fE#[D?LIhII I0DZDUFjE*IDHHQ}G + G&E=G̲FxE EֶE,E`C.bC+GCh\g{D&@!JHlI IT-DiCCZZDGO8G:fF:FEJE9nEDnC݉D63C*mCC CAFfCLAXA:BGIXJDE E5EEEI)E]FIHpH+ GFpHFE>ELDL I(IIxIjD](E5SFLoII"Y9HGZGLGr+%F dFELF"3E3H4GuFOFB#EfEUE'D>zMIXInIXIul?DMiDFeoI?HHJG4GAG]FuCENEE EYCo?D:rC$Ck&I4*BBḠI1pJ +ֱDSEU`qEcjE=E EzF/jHܡHCr(H 'F FKFE/pE?DI`J +]IIE*EF&I"EIVWHdDGGdiGE;I ?0I¹DPDB>1D1D3DuDEݏH̞H3HF-F#E%Ey?E \DIPIIIHvDDyuFoImkHH}uGqGM,G-iFFhE׌E E,(CĎCyvC!BpcCo]C.GyI JjD*D E1EF Es0JE-E9H>HmWG F/)FXEE@ESD{ IpJ IvIM#IjIDDFIWIH4GG~gGnt=FρF5FE/EC:C©CBaxC +ƮGI*{É)+lCC-~DDC˛7A<%,h Cn>GЀGEG,GBlC|߬AdgE6,EyDRD0gC73DÒ2ACNSBjB Cde[V<)rCb}J†B7"HPRI-I=mzC)BCoCsaDDFE*HjGbGHdG(G8GBFCEjEBEEz5Ή@-+C 3CCeBjDb¥HH_`HCD_ EtDDDD]F]EEDDCuCʣCkqCrH`H CHu@H} C;BDUU]Gz2F +F'%EiTD•D0DjDC XDCjCMCZ}&CCC.O@Co8wCIoH]G瓀G0B=9BjÊ2C"COCJ3DD D-CmAĪn51BtGGGGqC4Au@EF0DDQBɚD 4@#BCja¤! +MC7 {B¡_CaGBV-HvGSGIxCAbE9aDFwYIH~H6LGFr3FGE-E8DQhI@ IlI|pIۏEN.EF̀I2I%HG]G@GFFGzFEͪNEmCXC]CICÚC~b×}u+GH9H7"nBAìD +# DB@WsC Y7;„jBۆBB$1iH8HdHjHC ,(1CYBRdrÊ?CZC3 !xCp6ëC@Q>B8A@ݰC\C/{³U9DJ+TqGGGb/PCq|BhGB(gC{u(D^/DO.Db4@i=C.GCq ÇBLGo>Ge +GGnACsUC1EDDMD)BC݊Y\[o/OCc¤,AIuEE=C-@!T6cC'BpX`GIHIjEF +FrFT)FuFFCpY}*v%BH H"H @HyCBæʎC"#4E +?wDHrDk>gCYC XCj}„MApCqC-PC H I.HàHJ\DلDǁE/qtEsKEyMDD7D;D'3D.ރD4fAYBD3@OC΢>CÕCé[CI-hBԧGHVHmCL¥9C_D=tCZCCDrDWDn(CC)ݡC4|C?CH +H M GGCCBCAE%D-Dʄ[DeyD'oBWP{mCBV7Bҭ¤}YÒPAO\B1CמCX/FH߀I)4CvD}aLD-XD-[`D{DE3 E֚E#EyD)Dw;DzxCPDd1H(0@HpOHu@ISDDJ^D99EDlDbDhلD!Dp";CzC5@CpfBÙCV>CCZ|'^~¤XCBAJCWIpH+ɀJxPJVQDDVDmeDADE +VE`0IKI0J +zD5DE9G;GFEElE~E-D+TDwCvDzDтDyeDODFfD-CD&Bs=GHSH犋D;DCD)CM@D +DDhEDE +mD# Dn +CCnC(CJI./IhMHI D,DDMDxDiD"DhBCpcCÀCD.BC"guCp>CSCD:4BTB5BµC;˜FIAK`IpXDd *DgDqfD@E\EsE]_EPWDGEdzDD}|CdC5HDPQ6CTIPIގhI1{IaDTDEEbGODD>DD$OnCe.DFeCStCt]vC?DZ2CyCkDHÍ $C:,ƒxHFIpI +C C CCC̄CcD+ĢG5vGRE(ECtD0DD}CHߠHކH:H?9CC[ EHk2vGGy.F3FI_*F+[(D`DycD>o Dt+FE%E9D/cDo;C C,C +B9EIQIOaIxqI4D#aCDG +fF@F 3EPjDdFELDKx#CB6"nC)CݺC.C#B3CCC>lC׵<@T[H!=Hfc@H`G5CmCzBe1 R&3C +cTCT7T-BZh +ɗ\`COHQH?tvHY Ht/wC:y{BйUCSf3ç)ÓC9mB>~r.B)BSa)ÔGAB +AˆBæF5~GxHH1CэC2*>DVHC%DBU?DqD+DqDG,C#CACC%BCx~7H¾HHπHC8BȒCcE:DxDZMC$XD.9C)>CpuBIB ArCNCBpAΡY8~gZˆFH#HOB/B(C^FD6[DD߸DDD-DFD8DD:2CCYTCNHHRH1H HDeCBDKD {C߄DbwD2D +D](4nBŒvC =CCn³;|)5CPrûBYAi;G﯀HRHBC{CmD 0lD7)DD/_EEYE%EDD }D;DA[C`IC;HKHH8BHgKD,D\DD?DDjD=C 'CD@A3CMC5C_B݃-BBxB|{B@±C1CHUwIWID|GDEsEEDE.b9GGFl\EvEǻDmD5D)D+۫I(@IAIXI DD>DXHEsvH-|GnG:.FTDFE`E}D<DD{%D8CD#D1D upDRkC<C…HHu5@HXD &C{D DDE|D*DrDDD{,DkD|ChUCCBCQI&+@IFA>HH!Cr?D`kDD\DC)iDZICeC"CCAC"NC;%C%99–YBfC< 'Ѩ8HkmH +\@HC37CXkvB#CAt_CLCC;CCA&vA)sAGGGGCg@d C)DsJ)Cq8P,FCBBCL>ÎAmxAfCh¼ӯ8UBBVÁDGHb@Hn|[DAۤCPB+CٯCq C"\CD!mD=+Es]EF[DkDPDR~DDqz|I=vIUuHaHD,$3Dhl7D DLDSZD{CC*cCOlvrC<@A¶\)C-?Bbw$%CjH^HIHHBïBHyCs:DD Cm'DsRDSC/]BrBCGBqC‹HHH @H LyCCC%CE0DmkCCCuCMC|9Ñ?5B$AoCf1,C6BBU$CߙCAGI>pI8D)юDxZDDD[DDoxEE(Ef6EfQhE҅E +-E3DuDcǠCCI$xI@II8DD 4DuEBE-/DDWDbwDwHB4QD@CEelCXDV0C;%C()CwC/PrD>C#d3HnHq2@HDK!kD\D1RD,DZӣDMDE",DQEeDdTDD1;D)OCL*H`HoHeHD,D)DdCDCDD9OC0DҜC1.CD3CS, CIeCtxDgBïpC¸{XAuBHgH%I\CvDUD@DC~CjVDRYGWF[F SEJiD>D3RD$pXDCdzuHNHPHyH2D XEkHG]G1FK@EE@XEOD DzHDD cCݴnCZIBQCDAږCC\HsGGWB*CS=CTCyBBAÖDlDMD#CuQhKCpZW@ρGQ'G>G0G]i-CWqE>EDhCD%gCCFCFBRwPBq`CjB`C[\BօŒ|ȾCUjGEH9HjYXČôUCv\CCC~WDaD*C}CP>$BclAEHKH|]H\HaË( R|C9DD׊D#@D D BB^:Ñ!K``Co:,C +CKCPSXQB H(H HACC@HXCh3\ICZCC{D7CB0KBPB9hCC'GɀGiH#1@H:NBzaP&B)DUDESLDOkCB@3C‘m}[nCzCDECrMCui]P@8C=ȍ^G/IpIIDERHBސD@LDMiDDwD\ D"uD>DѱD.DFu&}:D&C[SIOIwIICjDDCDoC.C3CA}dNBaCUB!ÉD&CmYӬD5C C N(DvBiHpI6I_D,BϊC[Co3CђD O ACQD;}CC\RC~D?@7a]H0 HI XITSBaB uJCkqDA`rC##CbCPžZqCҰAChCorBnãC(ȯCY#—sXH?xHzHH'CuvCp,zBW/C7CDDVD|=>D+WCND=CݩSC\ +CYCCDB^G]GHHD- D D&D,pD?mD/jCMnA!#CPSCB̍S7NkCt+:@ ALh| +;Y,uCGɎJc|JEߧE,E/oDE pDWE:F=F_=F(EtZD%+DTxDDCIaInJJv.Dm;DE\G{F1FtEQGEkPEMGD+D.XD\Dd2C/DD4eD%D#C拺C?CީDHHCHP|B %!CjCgCCC>]EhD!+CŽXAcCTB,K@ݜ6HHsH@H(<˧ôAqED$DcCD2CDaAÔQ˜9C65r?@ 0?B3C(B\AЇH #H HC&DERHDx[BrDDDDDDID[DD4D*ODD`D)I + I8LHnHC :Dz/D DD:DhD#BdC}C]¤C ICSzCSB XC6sBuCCwOJpCqTC8U6H[WHsKHC|D-U;DDD\CW|DNEDD[D@8D}CnDmB$CEBHHKZHMH CQC%DUEBܮD2D1dBoC D{CB;4BBD C02)DÀvCBC"BѨ¯6TGH@HD>;8C#8CIDDDiDtD*DDDZD DD7C/l¤Cd(HEրHHfHHD1şD7ڌDdMDvD!D D, DQCYB@C^C!C!CB C4a3B3C+CIOZC-CHn@I& IBD+8>D-DtDQD DmEtvHEGG|b7FIE&jE_HRE XDc$CnIpII.?IICƐDtkdF +r+HHgpGYG0uFˀF8FE9E@E.PE)A+\oA?rÃu C4C~(HyHHHjCK%sDCI CIDw +DE/'E-E&/EDhbFDDAD/kBcD'?G>G~HKHjD2D ID\D|\DD)=C(DA8Cx2CGkCgC<buBKѡB(C:DRCBy(>C7!H-,Io2pIDDzDSdDDVD +DiE>HuH2GfF3F@EE3'E<DJIR(IrI@,0Ie/D7E9FviI>+HHIGG!+G\F|E0ZEAE{ɾEpBNhC#C¥C]C^o~F I$IGn*G q8FF_EEEV{ELkû6tykC9CsuïxD!}b H^`HHB[4BغCEIC-Ch6CE}KEGEDsCCɉC C+Bo$H6HHOHb|BdB1C@RFAEݿ,ETz"D3ICG C^JÃCWOAzFCV:CA E1BRCCHC9HHUWHcl:BHWBCxCe›$BCE6DqDB!C1Cm(BQAAρG'GH<9HKÍI'IVDi.DGBCuDD#D +E9qEDEEhDCCCѶCxyDF +I}6I|I#IID DKE1E_BE+D/C2CBr#ÊgpCC#A\@CʮÕfCdnFCoWôlAƼFI~IęD=DXUDfDHBDDoE99F(FJF%vEDDDbDdzeD4>DgZUH~ҀHIQ8ID,:DE:GvF'FKEһEdwEMDFDsDO.`CftDFDh0Dh\DZ^Dn)DaC/hCD"H1IJJr{E,EVdmE=Er@EҎE7IF4GH˹HBh H +v4F`FCEE}EhĈDkIiI#IΨJVDIEF!IgHHt}GGCG.AF[BF)E:#E EEWEEk%EDLI@JI%J +3E{IEuF2pI֊I$HLGwGjGH F}F$Eu ExEFE;EqEEdvD DjDwHkiIIzDDDrDfތDPDnEr-FF$FmE%-DDwDt?D?54DvIDI3II=KD;fDE$sGWpFFjE{EHfEA_ODCfDCsDa/DQFDƬD2KCD'MCu#GG1H/HJCoCåCH +¬7D=EW +EkeDCUC7mB=.Cc7BeGGH: HQVCAcA\&C5HF&1YEX0E!$;DoDNCMCnxB:0@B:B4CÐB^&lX1FI0I%D]EEnE%3EmErFHH=HF/F4[EsE_E: D׽I0JIPIpeD5IE{ FIgHwHsGi GEPG,ZFF EɥSEvEyEѥ^EǻENmE4E):Dl2DADKGxG}G8C|VC|X"BY.D+\D0jDBjC0D-iCHBB)GGuGyfGCn@C~D:1C!Cq=CTCBQA.S CyCU̎B_9 C8LeC% {C5CbÂDn'G.HNHcDMyDSDPCrDfD(ZDY2E(DDDkrDCL%D2#D KhCyI9a@IVHk@H²C?DE:6#DʼnDDnD8;DwC{C1C80ÿGFPH@H8B6bCpBQCFCD~ND*sDF"@HEH=CÿDDnGDD buD3D=DޅErEE DD.DoD*‹wC8CuD!CC}CDPA 4CytBGC+B,DPcÚ)GAGzGoCBC6L3ÉQ.B3C*Sc *D=mCYC%_Cer`Th@T_U@Gi~GMGfG¨BG`C D DDD)C@B>BLBSBbw-@!“LnBFdB@C8 +E±ÇbBA2GwHOHCfI{D@DD?E vE%E2EEIEe'DDX2C6C wCC9GHH]HwDD E!E-ZDDJD_}CD0!4CACB*{`CKBCFN;CCCeCAiH@IbpIDWDLDY DjRkDօDLDFqFnE=E5DD3D- +xDӿ@HJHWI*0Ic$C=D\+RD$G<̓FFFME{E$E(DtDtLC9,@DbDnD0(ND"$D3ΏD( RC*CҦrDDH^I@IcCClAD)}D% +DEE*zdDэDCDk>DDA_ DªImHIC!I)IL]DDxD4EDJD]DxCnC'X@CCf2CnD +C;p>D/ +éCOBL@4~FHHVD,bzD+[DXwDD{D03D܈DE3SEO%DDDgDD.YByCz(dCAHA`IGH(oHi_kDUDQVD:E0DDwD+D4?D, Cq CԏBaOCCÀC=C"ˆÖ{\,Bx' DHe@H)H" cBiBżB{}AY˜C%CCF CvO8BXÏگ,|LC1HqH (H-VH# +ªtC=jkC3RDkCTC(pAIIDGDDCs_C˲G3GaHI gDc3D DpvDtFDqLD7D4CCQaDaDBqCW_C{E=CآCwC\C_CIB=C {C=CAGG`GmCDbGD&7C=CɕAC½|CCpC¹BI`BdGC*A&Y`AGGԀGGVG_›x[CytEҥÉBbCZnUB;Ä1 +BßC\C C;@Cf‡\ ƒBHoHFa@H9DDTs?D4}D%^DNWD"DED˔D|DDD/D4CfDgGDHyH~H|HDmZ|DDVcE5DDbCED7C@HC_2HCStB@D +9sԕűNLRCBPjCmGrhINw Ic6Cɗ=tC.D^`D!C$D#G0F)FZE1:RDD8D7CEGCCgIM@I L7I5ICC5CSEi'GXjGDqFΌ-F EnE@EQVDk"TD,dD7DG^eCgACBA[țC +BHzI;pIUǀC)DC$ CD#DnhE:HJGo6G,F EvED~DBJI0рI8FIm I(DQDG8!DBE߅0HzH  +G+FeFFlEޣ^E>]E4EDߥDD]puD4B˅CC/è8+HwG0H1D YCAD,CADaC_D YEHDyD#DODǵD;fB B$jDH7HaLGH!C>DGDpD*NDTD +PC6C4?D*RnBtByC6"YžCDBRBVQõwB@ +G< I +IxDVCDX]D,@DcD +DXDD0DC)DICnFCǗB\CsI(IuI"I34DD4D[DRDDCD/QCDC?fC`AICe@SBC*Br@BvCwVDCzGiIyIҹDD\DtDE+FE/EmElE2gE*D>DmDmD!D*MCDIJ6oIlPICDDNvEJE`D֥DGDi +ChC CWeD$eCCo2xCACB\CeCEZ¸i;Hc@GGCBD C4YCBgDKDDD1DC&CMCCBRGQ +G: kGGٙ)CY1CirDPCDCOCpB=HCNBE4ZBH$BKC7_B[B;CLqeC2o°`B;C{b C3iHH.@HCQqC9WuFBCCl5.DkDuD`TBhpCxB{!CJY49KGoGYE]H (H C3mPC!tBEgE)DD%CC{@B-JC\Bc|B..C'B?BUo\BK6BW9C BNH1IW`IrD-H2DI D`yDD3CE9~H')GGQF76E;E<ZDDpD-MII)iIQ4If DVB ACJQZCOCyB[1~WFQ EKCK}C_H +@GMG;0B |Cq5D~)CCC:CDƈD+AD8FC~ٙ='D8C޻Û'BqHG7GGGaCâWvBE]DDwpBOhC,nGyC-CRw[{CCD +Bo\C*yBRB0GhH%H)DD7MkD&ND:]D6fDyDtiE++DVDݶDTDHD *CCn +IcPI2&H>`H C[D-`E D`D@CĕCMCUBACBԾC$C!CC;#;CIp·CB³ pG=6I VIbC⪊C߻D)Ch ChDG;D6G0&FFWDEWDMDŖDHC5,CI.`IRHBI>zD`HCdE =GsGEF֑eFh{EtE E +Dm,D;DATDWBgrC9[C-CC|Cn+-C_5C?GlHTH:C{D0CL߳C9DmDYDEj>DKD(YC_CC6BP:C@D2H I~HH5CCDS[D$D(MCrjFUCgJB @jCʔ[HC66BCvÍ~=D՜Y{A%!HIIwIATDD\qCDApD@ǭD=pDDD۶DDD(D-DCCtC5II#IpIDzD[D<Dk/>C%Qgó{DwC֠C_C-Õ9B[OC?CwC(~B<6=C-B9H;GGCFCFDDC3VD*,DaDI@DDrDE"DKhA~4CiC%C/B玷GhGG̀GC}D!DuD]DGeDlDWB&dDCk APC CBATBC0C=BwB`ÌFCx_kC8H|E@H5@H@]rBtC3C(ACC `R8hH H}H5,Џz?BUR>CpCuCĐDؚDIDB mCw~C-+DABPkA.GGUwHmHocC]E,|^D RD+D CDC6үl&zC/@>RCÁ8?R0"C4"Aɝ3GpI2JIJD#D-:CkD0rmD=Dy,ESHiG_G^F[E;]EEnDDBATIghInI$FI:D+DY9FKUI'5HtZH0\G{(8G FIFoEl!EJEJEI q­PöCmCVC=FQyÙhC@;H\HSHVCDNDRCeD#GD:Dd*D:Dj_ODOD"C,+C 3CWCCOGCGH!Hs"lCDD_D?D|eD C!C/ DSCB{C/„;-ºYCS4/CRJC'RL B(XaBCHg!"GIIIs]0D=.DLD4DzD=D%E[HeG*TGSYFuEOEID隻DJDpII8I3;IWDLD+F;IHXHGf2F&=FFEEENEAK,E-CWA(C>(C<Å£9; <ÂSCGsGvGovC;ÄJ.C_C +CmCUD(DDK$DcCC82VC/PC>CGP>GH.Gj9G^\C%_X wBnDCM4CنB{;BCRC8CtԏBBTCjC@4&B< ƅBaHJI<`PIXC}BD/ڲC8DBDj^Eu(jH~mGnHGFEVEE8?D[VCcIw +0ICI_I7 D}DOF9I5HHzGgFEF2FHE2EC>EPsEDDnyD\iCxFSC1CtCC@nH@H`HDxD0oDMDB2Do.Doe]DqEDDDqD\CBLD#DFB0mIPI*FHHן>D$5CoDd)DDҢDZHD%CB.@QCBZCYCDh uۉCCBPjïןHvFFC$y$CWQCG{;gCE DW(CeUEyC7M” ܫkBC)GGGB@FF|RCk֤7CY]DsDqj[CCM9Bӝn*۲q¾^?\~PyB(¸hB$6C.*=C¡+KC GwIJD9DBgDoD$DԫDE5FF/'rF tE4qfDDPCǏD+DI;&I]IhJ}D0yD{E1Ga\F߃Fz(>E%E_EBWDTDMD9*CDf C%C$Ca7D)^)Ct'CX D rC0GvH7HDI oDBBVDD gDDE'E MDڼE ̒DtDGCD#CDBnI=IPHH.-DXܕDQ*D̹bDlSDDD =C{DN8A`B:A(3BCCC6B0BCXqXŸpCm2QF|H.PHN`DDxCPPD#+PCDV +DIDDoDήDfDCD6KBюC3CC VH囀I!H45HV3Di#D@^D\D D`D9CChDC$D 3Dw*Cu.d-CC,\xCX+FHXHTwCrсCWRC駁C=ICuCa+vCtDCD,CkB*HTHJHVGHR6Cj^@гDE2:DDzK3C[B?CBy00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target2/CellCounts3L_AB_02_ND050_02.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target2/CellCounts3L_AB_02_ND050_02.fcs new file mode 100644 index 0000000..a5243d0 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target2/CellCounts3L_AB_02_ND050_02.fcs @@ -0,0 +1,69 @@ +FCS3.0 58 18364 18365 36364 0 0#$BEGINANALYSIS#0#$BEGINDATA#18365#$BEGINSTEXT#0#$BTIM#13:54:19.09#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#R0026#$DATATYPE#F#$DATE#25-Jul-2025#$ENDANALYSIS#0#$ENDDATA#36364#$ENDSTEXT#0#$ETIM#13:54:47.58#$FIL#CellCounts3L_AB_02-ND050-02.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#V7-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#449#$P11B#32#$P11E#0,0#$P11N#V8-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#807#$P12B#32#$P12E#0,0#$P12N#V9-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#652#$P13B#32#$P13E#0,0#$P13N#V10-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#512#$P14B#32#$P14E#0,0#$P14N#V11-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#399#$P15B#32#$P15E#0,0#$P15N#V12-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#344#$P16B#32#$P16E#0,0#$P16N#V13-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#352#$P17B#32#$P17E#0,0#$P17N#V14-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#549#$P18B#32#$P18E#0,0#$P18N#V15-A#$P18R#4194304#$P18TYPE#Raw_Fluorescence#$P18V#637#$P19B#32#$P19E#0,0#$P19N#V16-A#$P19R#4194304#$P19TYPE#Raw_Fluorescence#$P19V#562#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#285071#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#FSC-H#$P20R#4194304#$P20TYPE#Forward_Scatter#$P20V#49#$P21B#32#$P21E#0,0#$P21N#FSC-A#$P21R#4194304#$P21TYPE#Forward_Scatter#$P21V#49#$P22B#32#$P22E#0,0#$P22N#SSC-B-H#$P22R#4194304#$P22TYPE#Side_Scatter#$P22V#339#$P23B#32#$P23E#0,0#$P23N#SSC-B-A#$P23R#4194304#$P23TYPE#Side_Scatter#$P23V#339#$P24B#32#$P24E#0,0#$P24N#B1-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#682#$P25B#32#$P25E#0,0#$P25N#B2-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#400#$P26B#32#$P26E#0,0#$P26N#B3-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#421#$P27B#32#$P27E#0,0#$P27N#B4-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#406#$P28B#32#$P28E#0,0#$P28N#B5-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#343#$P29B#32#$P29E#0,0#$P29N#B6-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#249#$P2B#32#$P2E#0,0#$P2N#SSC-H#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#730#$P30B#32#$P30E#0,0#$P30N#B7-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#457#$P31B#32#$P31E#0,0#$P31N#B8-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#392#$P32B#32#$P32E#0,0#$P32N#B9-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#516#$P33B#32#$P33E#0,0#$P33N#B10-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#385#$P34B#32#$P34E#0,0#$P34N#B11-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#299#$P35B#32#$P35E#0,0#$P35N#B12-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#422#$P36B#32#$P36E#0,0#$P36N#B13-A#$P36R#4194304#$P36TYPE#Raw_Fluorescence#$P36V#490#$P37B#32#$P37E#0,0#$P37N#B14-A#$P37R#4194304#$P37TYPE#Raw_Fluorescence#$P37V#586#$P38B#32#$P38E#0,0#$P38N#R1-A#$P38R#4194304#$P38TYPE#Raw_Fluorescence#$P38V#230#$P39B#32#$P39E#0,0#$P39N#R2-A#$P39R#4194304#$P39TYPE#Raw_Fluorescence#$P39V#294#$P3B#32#$P3E#0,0#$P3N#SSC-A#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#730#$P40B#32#$P40E#0,0#$P40N#R3-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#372#$P41B#32#$P41E#0,0#$P41N#R4-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#348#$P42B#32#$P42E#0,0#$P42N#R5-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#352#$P43B#32#$P43E#0,0#$P43N#R6-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#364#$P44B#32#$P44E#0,0#$P44N#R7-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#851#$P45B#32#$P45E#0,0#$P45N#R8-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#418#$P4B#32#$P4E#0,0#$P4N#V1-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#370#$P5B#32#$P5E#0,0#$P5N#V2-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#384#$P6B#32#$P6E#0,0#$P6N#V3-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#487#$P7B#32#$P7E#0,0#$P7N#V4-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#295#$P8B#32#$P8E#0,0#$P8N#V5-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#381#$P9B#32#$P9E#0,0#$P9N#V6-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#335#$PAR#45#$PROJ#CellCounts3L_AB_02#$SPILLOVER#38,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.61#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts3L_AB_02-ND050-02.fcs#FSC ASF#1.1#GROUPNAME#ND050#GUID#CellCounts3L_AB_02-ND050-02.fcs#LASER1ASF#1.03#LASER1DELAY#-27.925#LASER1NAME#Violet#LASER2ASF#1.09#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#27.55#LASER3NAME#Red#ORIGINALGUID#341265b1-fc61-449c-b286-3e2cd0945538#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LIN#P21DISPLAY#LIN#P22DISPLAY#LIN#P23DISPLAY#LIN#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P4DISPLAY#LOG#P5DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#02#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#2#HIILA C̙D/D @C]CNDVFF^F)ECDAD7D5C`EC3]H@sHDH HƠCDbG?GFU*EcIEeE[DD!IDbCG&CJ-DKD2DCpCf/CMKHC}VrHhSIUpI4ýCJD5DC_D()D#QDE}:DbDLCD3CN+ B~qfCCڎHH7H`IBHC:D/HEi"ER(DD{uD1D7”OA]C iCQTMB^COD7VCHC`貽C˃DgĿ H:dH RH?C(C{‚͖B'qC¶D9CJCJBGBյB A\nGـG4G6GBFª +C]DFD,CMBBvBbA+fCOãC.rB_4AC`E%Bk[0Bs8ÏBcDH@IMI ҭDDM;fD C3RCfCICs9DDDCCwCBbFW$F"EEQDD-A BCmC^[6j2AͯC7QCTCLCשBo>2HG7G#BCC*KCcB\BHBŊD4@D.CHB]¤'BH - C-GG̪GGIBABBDDdD-ךD ;C,CG¹ÐCG |AjCV2BH®ûHG@G܀G:B?'BœAoZ]Be,BXFCDe!QCa]D CCB–T_CDCgG+GG݀GfCBZŒURC/4D`DFC +BC{C`BC[CYxCC!|C iKA_AYB\%A6TH:@I3I]UD|[E^DwDTDڃLDwE[zHDFH9VH*JF/FbcFE"FH+H GFEFEE=D¡D~ ILItI I"DZXD`FF\I-|HH8GGG+F{fCExAQ 57CCb%H @HH +zHF!CBEDyD*Dl6A +CgcpB!fBDQC#ñDBBA@~B{BI^mBwCXFNII$DiCD DD9D +LD>NE̳ZH'HFjHFF:&EtEpDDu, +III `I*VDU](DtFpIsH$tHNGJGN,G,&FwFEvE/EP\COB}AȗCC%wCCC1FHȀINCPCD9D/DQpDGEHaH(G=PF%F?&EJEGŃE#>3DpII%I I D$D-FwIMH wHX[PG AG,CG3FENEfEEm8CÄBCCn7CUC1B"}HLH +HC`C"l_;nC7CbfC4@wBDHF#CWCC /Bv*ċCmI­bHGCHvH B_C4`D(D̵ DZCVCCBdC_ CQZUAÕ_#Cd:Ƌ Cp@RtC2g0CHH~H6QC㩑BCC]CDѺfDYiD@Hn?C*`9_dDQC>HH;SG﵀H +uC:oBߓ+CR ELD/Dd]CiCC;A4QÈGO6{<.C`]S†k./kCczCCnBG +BHHF@H$ChC.wAAlB/D/C՚D%EPEIlE@CCDC/CC2DQ6G G0HH#)C7(fbC¢F\pTE`Ec,DD DaBCC a D`B89Óó$By>TEGGG%BA!LBQUC,A8C3KlC@`G~ JC-CBAeCSCg>!GLLGI(GLGaxWECivD نCUzCl^XPB&B{"hi?E6C3BA Vv?‘c`N5DytC^HDI0ID2nD.CD3]DDSEHHGFFiE\`E?eDCDI5pIkH I QDKfD]FvI@HHK*GYG"9G +zKF{E(E0ERE~ANCCa6˜\ASDMCCCn)Lc=BE+C+]ƅHr@HCHrCtTgACa*D8 C4@CBsD P;[BCGdB!6C3ACD}|H9@H1f\H H|nžVABKCCGCUÆ COXCBd }C%CCw5ILiA¤CNC}B GIMIDI%DeD*FD|EiE + E]HxH>GԭFEnF E$ME@gE4DܼIxI%I=IlD7 QDY Fq˽IEaHÚHPGoG+G0FОECEEvE{{B_D36ÛkC!1CC(z GXJ)"XJRDܭE}E2E#ذE)E*EGG xFlE˄E@*D1D^DDFŻIDIU=]JWhJ0pD9DRE ZH(ɹGlG3њFvFFEw*QD;DƢDH4D + CUD'2DDC\D(*BD#AHmIPI2EDRD&=D7DņDD9EHH +GFYF:EEBEEDzvIIII*piDHD=Fn+I7[HHBYG?zGGFhEGEEGe}EYYeCb BC?CkC8CCrHw@H\H'QCk@D,"B&DG=D=D'FāFCxCnaCY# +Br CwD;ۘwDCtš)CC*8BfGGqyGGC84VA#2DmSC$*CCTe@Ax'C?JC}B;4CqC_~YCmB1,CF;C +bCKBšCH:@Ir0IblDzDVDDﲮD.E[E͠HWH:HBFߘF1LJE]|EsE:=DIHIrIR0I~ +D0Dy_FlIsH HHGb_GKG8BZFF +ExEiEhrtCeCsCAgCG= +G*G[C52ƒINB_WÎ +C +CCmD/3C DZ`=BlCpC[ HXH HC:4CCB69C;=A6CJEbDDL)CQ&CCAsr֌&b H`Hy]H]8Hc0B@v@pgB1EtEDD=D[#C?ÕnBnR0КChiBCAl+y[COBm,CPCCwOGНGGsAArf*Br{C<B%C@=<EO4D5DgC^Cm^C8G^CLJqC wAkqGG~GgGzCg?BڮC{E E_ED".DDCC(T\@ARAPCACBpX.eEGMH@@HGCWAѿWA)„MBwBD7QDDC[Cɯ82CnAߋCtNG'GGqG,r.ä;DLDC[sC1.CCJ_ZC+2EC[;B. +m f p>7zC E;6F~I5 I6C$D?nDD2ZDDE5HYVHGړF0FtEHbEeE?EIrIgIxI3D8EmSFtIJ!cH +HSRG%G-Z[G^F=EEE=Ea%B B+'wPCduB C3,)G I IC~C+DDDDV4EԑHHaGF.FE‹E_EihDI II +I GADƏDs FIVHҐ@HbGG7 GF]EoE_EʖEFCBC(CG3CiCCO1Hq#HH5.fCNՒCCoCDNC=CC/A#ۣCnlfB&C#>XH5HHm@H=?5CYiB&\ChC7CunC W +CBÇTRGaC~CBB!@LC7<=Å[BwsC,C@FC\ߥCKCBC.-CD6D3D\CLBRB B/7CC~HkHi׈Hy3HBz@AnC/*lCC3xGc4{BI!3CC +bhHrрI.xI.DDzD(D$D=D\FnIH H@dG ZFcF#%EvEy`DI*Iԥ@II8E T*EFiI+BI:RHH GGJVF$FVHFF1EWCgIùC;\{BcD6BEGKHHC=C2b0R#CB~I,CY¾ CÆ,\B%9Hu6@HpH`HdcѰB4ÂȕC~ACdCDXC2B*YBC67ÄCIBEBӗLtC c"'οБ!CGU{GI֍J 8D`EE EeEEQ FUH#HOGKbFFE0EV;EFrD.IJIIiD;DF{ԙI9wH7HBGbG GGFEvEwEleEr{ETE3EgESEb/D EDtGUJJFa2GGpG H+sHHkHw`H0H*GG#GG4FiFAI)JJ@jlJG:oGnG]rHJbHGSGVG GE,FKFNFF?FFLPEFF +#EVEDE0EEA9HVI`IUD +E#ZEjE<]E\EVF)HPHcH#k9GFcd F +EEl+DPIŷxI;I I2EDrqFI;$IKTHGǕG`ԕGAFy +EFEhqEEEwEoRqE3EAٴD.D#DGIBIbE+Dj/D8DVDPD pDE*Hؾ/H?bHH +$F[PF?EBE#E;DzIIII/`IFTD"DJFTIy}H~H G+G\`GBxF$FVwEEǗEϲAwCeCLQG=CodC)BCCFI4IDICDGD`sDęD2E|H?WHGF8F]EED5aDߛDKI;IHlID?DgFtuIDȪHHOGG'G>FEַE)EEhCK D !)A4.CCV%CH6I5I+jD#D|nDMDDDqEHsH%sG FpFqEʑEuEGD%9IpIPI"I<,!DI}DFIRtHH]GTG,CG1FCE]EqE7Ea.B΢>B?~CCCA0 bHeI=IWsDoǮCJ.DX3D{D)DCTEƠHҧH8HFBF2EvQEnEbeDmI II&JI;9DpDFI{HHBJG;GWbG=FFLEE!Er"B/8c% {åCDiClG.GҭGGaBBCΟ?BoBABbCx\@bBS?qCNlwGRG~`GýGTÔFB CD|C<9 CUkC%drBIgWY*ACrP@.igAuB#ÓwUCGIH\sHSXABCæCg C4C JB :DJD{C?B^!AA> kCuGG0HTHyAp]BCEEOD:D' +ClKDNC܅ARCBۭ5`gÖߚBy#zl>8Cv#BNY(h;CeCGӀH7 HCH5Bu/C;DB(C'}CJA@Bl"tCDslBveUC#C/ClWHHzWH`H@AEC-qC\DnD…ÆB.XÿԀ8IB _CsCš[2#O\*eYB,AH2GG#B5ϋC®CN@€C%CC''VC^MsÉCC/GHGEG[GC®&r9HDC˯hCAߌJcB^{B}jCE^ĆM@B~C$?Ëřw +CKqBC&GwHD@I;DT>C̢DPDDDEQH%G G&FTEJkEvEEW6EaC!Ll{QaCќ)C0QAϬGnHH&+TBwDA +CC=GBAfjzCCAOFkCXCtC;B} Anl 5GGAGC@BzdB''C]Cc:D3CD{CBBQ}.qBٻCG]G}TGG;Wº2BRDL0DSCβ"*,QSVübK-C\bCA^A`¬OҀC2TCC?Ht@IrhIDDEE=EjCu"-_¡B۸H`H-H.@HSCvoCZ<@yVgCQ7C{ICBi¤W09,CCC^H1BCDC]CJ+CA籲C G +IJ@`IvzDDBDDE!DFLI Hy1FE[Eo'C|/B iOUmBÅmC +pGI5nPIElCCpBDDCufD'E?Ht"GРGŖFqEޙEuE=EDI"III"8uDODF4_I!XH3H GYFreF|4FGEZEm|E/E2jDPDD=CĤCCDCO*Da1HIz@I)DDśE,EkEpDHEH1kG_G]aiF2E~EM0DDzqBD}I(J {IRIDbD_FxH@HTĥGyG% NF"FF2EjEMUEE j\wC%so\CKv"CPKUCKBGπHрICłD{:AD D8DD?fD'DGF42FG wE4rkD ^C$C$Cc BIpIH#ID#gCS6DG}G(aFEEErD3D"C&C/D<\Cp=/'Q LaCN{*CG7G^GCfrAޱBtwfCwCB{#gD SC(cCBI8CVZiLABS#G{GcQGqhGkC@CrC^xEUMDwuD;'C5yCC,A5|B5QIBO:NjC6@{ŠBl~?tCHHCUIB_HuʀGùG.BmCR CNC73C/C>TD`DD`D%mCBCmAPxCޖGG~GG{}#mg >D}eDtCCBB=שC[*]pX^ilÇCy#CHCJA5CgvAHGGFB6!CCGƒkC3YNC;DcCC6A4 /p>€}*%.zGq^GcGmGgC)XCHD&iD)CC½CXC]B8>ž1AYC +R®@­yhl #S ^)B*m¡? B=GcI>`J"DF\E4t9E:֔ECDŽE^+E_F$~uHdHHXHFFFF ,EBEEv7D I*J I&`JDEF9IIFHGn'Gi'0GJ%HF5F#EvEVEO9EkE= +EfkEEHE +!;DGD+vCFIHH*H2BS6z?BX7A6CmpCLC4 EF!DߤKD5C)C9CCeMCdA(8GGH4H5k C‹P0TC-F;EEoDXD ޭD:Cw$B +Ye,{%BMØòQC}wCU@}u+H~܀IАIOAD;KDIDD E+v{EEESHH/dGrmF&WFR_EgE1fE#[D?LIhII I0DZDUFjE*IDHHQ}G + G&E=G̲FxE EֶE,E`C.bC+GCh\g{D&@!JHlI IT-DiCCZZDGO8G:fF:FEJE9nEDnC݉D63C*mCC CAFfCLAXA:BGIXJDE E5EEEI)E]FIHpH+ GFpHFE>ELDL I(IIxIjD](E5SFLoII"Y9HGZGLGr+%F dFELF"3E3H4GuFOFB#EfEUE'D>zMIXInIXIul?DMiDFeoI?HHJG4GAG]FuCENEE EYCo?D:rC$Ck&I4*BBḠI1pJ +ֱDSEU`qEcjE=E EzF/jHܡHCr(H 'F FKFE/pE?DI`J +]IIE*EF&I"EIVWHdDGGdiGE;I ?0I¹DPDB>1D1D3DuDEݏH̞H3HF-F#E%Ey?E \DIPIIIHvDDyuFoImkHH}uGqGM,G-iFFhE׌E E,(CĎCyvC!BpcCo]C.GyI JjD*D E1EF Es0JE-E9H>HmWG F/)FXEE@ESD{ IpJ IvIM#IjIDDFIWIH4GG~gGnt=FρF5FE/EC:C©CBaxC +ƮGI*{É)+lCC-~DDC˛7A<%,h Cn>GЀGEG,GBlC|߬AdgE6,EyDRD0gC73DÒ2ACNSBjB Cde[V<)rCb}J†B7"HPRI-I=mzC)BCoCsaDDFE*HjGbGHdG(G8GBFCEjEBEEz5Ή@-+C 3CCeBjDb¥HH_`HCD_ EtDDDD]F]EEDDCuCʣCkqCrH`H CHu@H} C;BDUU]Gz2F +F'%EiTD•D0DjDC XDCjCMCZ}&CCC.O@Co8wCIoH]G瓀G0B=9BjÊ2C"COCJ3DD D-CmAĪn51BtGGGGqC4Au@EF0DDQBɚD 4@#BCja¤! +MC7 {B¡_CaGBV-HvGSGIxCAbE9aDFwYIH~H6LGFr3FGE-E8DQhI@ IlI|pIۏEN.EF̀I2I%HG]G@GFFGzFEͪNEmCXC]CICÚC~b×}u+GH9H7"nBAìD +# DB@WsC Y7;„jBۆBB$1iH8HdHjHC ,(1CYBRdrÊ?CZC3 !xCp6ëC@Q>B8A@ݰC\C/{³U9DJ+TqGGGb/PCq|BhGB(gC{u(D^/DO.Db4@i=C.GCq ÇBLGo>Ge +GGnACsUC1EDDMD)BC݊Y\[o/OCc¤,AIuEE=C-@!T6cC'BpX`GIHIjEF +FrFT)FuFFCpY}*v%BH H"H @HyCBæʎC"#4E +?wDHrDk>gCYC XCj}„MApCqC-PC H I.HàHJ\DلDǁE/qtEsKEyMDD7D;D'3D.ރD4fAYBD3@OC΢>CÕCé[CI-hBԧGHVHmCL¥9C_D=tCZCCDrDWDn(CC)ݡC4|C?CH +H M GGCCBCAE%D-Dʄ[DeyD'oBWP{mCBV7Bҭ¤}YÒPAO\B1CמCX/FH߀I)4CvD}aLD-XD-[`D{DE3 E֚E#EyD)Dw;DzxCPDd1H(0@HpOHu@ISDDJ^D99EDlDbDhلD!Dp";CzC5@CpfBÙCV>CCZ|'^~¤XCBAJCWIpH+ɀJxPJVQDDVDmeDADE +VE`0IKI0J +zD5DE9G;GFEElE~E-D+TDwCvDzDтDyeDODFfD-CD&Bs=GHSH犋D;DCD)CM@D +DDhEDE +mD# Dn +CCnC(CJI./IhMHI D,DDMDxDiD"DhBCpcCÀCD.BC"guCp>CSCD:4BTB5BµC;˜FIAK`IpXDd *DgDqfD@E\EsE]_EPWDGEdzDD}|CdC5HDPQ6CTIPIގhI1{IaDTDEEbGODD>DD$OnCe.DFeCStCt]vC?DZ2CyCkDHÍ $C:,ƒxHFIpI +C C CCC̄CcD+ĢG5vGRE(ECtD0DD}CHߠHކH:H?9CC[ EHk2vGGy.F3FI_*F+[(D`DycD>o Dt+FE%E9D/cDo;C C,C +B9EIQIOaIxqI4D#aCDG +fF@F 3EPjDdFELDKx#CB6"nC)CݺC.C#B3CCC>lC׵<@T[H!=Hfc@H`G5CmCzBe1 R&3C +cTCT7T-BZh +ɗ\`COHQH?tvHY Ht/wC:y{BйUCSf3ç)ÓC9mB>~r.B)BSa)ÔGAB +AˆBæF5~GxHH1CэC2*>DVHC%DBU?DqD+DqDG,C#CACC%BCx~7H¾HHπHC8BȒCcE:DxDZMC$XD.9C)>CpuBIB ArCNCBpAΡY8~gZˆFH#HOB/B(C^FD6[DD߸DDD-DFD8DD:2CCYTCNHHRH1H HDeCBDKD {C߄DbwD2D +D](4nBŒvC =CCn³;|)5CPrûBYAi;G﯀HRHBC{CmD 0lD7)DD/_EEYE%EDD }D;DA[C`IC;HKHH8BHgKD,D\DD?DDjD=C 'CD@A3CMC5C_B݃-BBxB|{B@±C1CHUwIWID|GDEsEEDE.b9GGFl\EvEǻDmD5D)D+۫I(@IAIXI DD>DXHEsvH-|GnG:.FTDFE`E}D<DD{%D8CD#D1D upDRkC<C…HHu5@HXD &C{D DDE|D*DrDDD{,DkD|ChUCCBCQI&+@IFA>HH!Cr?D`kDD\DC)iDZICeC"CCAC"NC;%C%99–YBfC< 'Ѩ8HkmH +\@HC37CXkvB#CAt_CLCC;CCA&vA)sAGGGGCg@d C)DsJ)Cq8P,FCBBCL>ÎAmxAfCh¼ӯ8UBBVÁDGHb@Hn|[DAۤCPB+CٯCq C"\CD!mD=+Es]EF[DkDPDR~DDqz|I=vIUuHaHD,$3Dhl7D DLDSZD{CC*cCOlvrC<@A¶\)C-?Bbw$%CjH^HIHHBïBHyCs:DD Cm'DsRDSC/]BrBCGBqC‹HHH @H LyCCC%CE0DmkCCCuCMC|9Ñ?5B$AoCf1,C6BBU$CߙCAGI>pI8D)юDxZDDD[DDoxEE(Ef6EfQhE҅E +-E3DuDcǠCCI$xI@II8DD 4DuEBE-/DDWDbwDwHB4QD@CEelCXDV0C;%C()CwC/PrD>C#d3HnHq2@HDK!kD\D1RD,DZӣDMDE",DQEeDdTDD1;D)OCL*H`HoHeHD,D)DdCDCDD9OC0DҜC1.CD3CS, CIeCtxDgBïpC¸{XAuBHgH%I\CvDUD@DC~CjVDRYGWF[F SEJiD>D3RD$pXDCdzuHNHPHyH2D XEkHG]G1FK@EE@XEOD DzHDD cCݴnCZIBQCDAږCC\HsGGWB*CS=CTCyBBAÖDlDMD#CuQhKCpZW@ρGQ'G>G0G]i-CWqE>EDhCD%gCCFCFBRwPBq`CjB`C[\BօŒ|ȾCUjGEH9HjYXČôUCv\CCC~WDaD*C}CP>$BclAEHKH|]H\HaË( R|C9DD׊D#@D D BB^:Ñ!K``Co:,C +CKCPSXQB H(H HACC@HXCh3\ICZCC{D7CB0KBPB9hCC'GɀGiH#1@H:NBzaP&B)DUDESLDOkCB@3C‘m}[nCzCDECrMCui]P@8C=ȍ^G/IpIIDERHBސD@LDMiDDwD\ D"uD>DѱD.DFu&}:D&C[SIOIwIICjDDCDoC.C3CA}dNBaCUB!ÉD&CmYӬD5C C N(DvBiHpI6I_D,BϊC[Co3CђD O ACQD;}CC\RC~D?@7a]H0 HI XITSBaB uJCkqDA`rC##CbCPžZqCҰAChCorBnãC(ȯCY#—sXH?xHzHH'CuvCp,zBW/C7CDDVD|=>D+WCND=CݩSC\ +CYCCDB^G]GHHD- D D&D,pD?mD/jCMnA!#CPSCB̍S7NkCt+:@ ALh| +;Y,uCGɎJc|JEߧE,E/oDE pDWE:F=F_=F(EtZD%+DTxDDCIaInJJv.Dm;DE\G{F1FtEQGEkPEMGD+D.XD\Dd2C/DD4eD%D#C拺C?CީDHHCHP|B %!CjCgCCC>]EhD!+CŽXAcCTB,K@ݜ6HHsH@H(<˧ôAqED$DcCD2CDaAÔQ˜9C65r?@ 0?B3C(B\AЇH #H HC&DERHDx[BrDDDDDDID[DD4D*ODD`D)I + I8LHnHC :Dz/D DD:DhD#BdC}C]¤C ICSzCSB XC6sBuCCwOJpCqTC8U6H[WHsKHC|D-U;DDD\CW|DNEDD[D@8D}CnDmB$CEBHHKZHMH CQC%DUEBܮD2D1dBoC D{CB;4BBD C02)DÀvCBC"BѨ¯6TGH@HD>;8C#8CIDDDiDtD*DDDZD DD7C/l¤Cd(HEրHHfHHD1şD7ڌDdMDvD!D D, DQCYB@C^C!C!CB C4a3B3C+CIOZC-CHn@I& IBD+8>D-DtDQD DmEtvHEGG|b7FIE&jE_HRE XDc$CnIpII.?IICƐDtkdF +r+HHgpGYG0uFˀF8FE9E@E.PE)A+\oA?rÃu C4C~(HyHHHjCK%sDCI CIDw +DE/'E-E&/EDhbFDDAD/kBcD'?G>G~HKHjD2D ID\D|\DD)=C(DA8Cx2CGkCgC<buBKѡB(C:DRCBy(>C7!H-,Io2pIDDzDSdDDVD +DiE>HuH2GfF3F@EE3'E<DJIR(IrI@,0Ie/D7E9FviI>+HHIGG!+G\F|E0ZEAE{ɾEpBNhC#C¥C]C^o~F I$IGn*G q8FF_EEEV{ELkû6tykC9CsuïxD!}b H^`HHB[4BغCEIC-Ch6CE}KEGEDsCCɉC C+Bo$H6HHOHb|BdB1C@RFAEݿ,ETz"D3ICG C^JÃCWOAzFCV:CA E1BRCCHC9HHUWHcl:BHWBCxCe›$BCE6DqDB!C1Cm(BQAAρG'GH<9HKÍI'IVDi.DGBCuDD#D +E9qEDEEhDCCCѶCxyDF +I}6I|I#IID DKE1E_BE+D/C2CBr#ÊgpCC#A\@CʮÕfCdnFCoWôlAƼFI~IęD=DXUDfDHBDDoE99F(FJF%vEDDDbDdzeD4>DgZUH~ҀHIQ8ID,:DE:GvF'FKEһEdwEMDFDsDO.`CftDFDh0Dh\DZ^Dn)DaC/hCD"H1IJJr{E,EVdmE=Er@EҎE7IF4GH˹HBh H +v4F`FCEE}EhĈDkIiI#IΨJVDIEF!IgHHt}GGCG.AF[BF)E:#E EEWEEk%EDLI@JI%J +3E{IEuF2pI֊I$HLGwGjGH F}F$Eu ExEFE;EqEEdvD DjDwHkiIIzDDDrDfތDPDnEr-FF$FmE%-DDwDt?D?54DvIDI3II=KD;fDE$sGWpFFjE{EHfEA_ODCfDCsDa/DQFDƬD2KCD'MCu#GG1H/HJCoCåCH +¬7D=EW +EkeDCUC7mB=.Cc7BeGGH: HQVCAcA\&C5HF&1YEX0E!$;DoDNCMCnxB:0@B:B4CÐB^&lX1FI0I%D]EEnE%3EmErFHH=HF/F4[EsE_E: D׽I0JIPIpeD5IE{ FIgHwHsGi GEPG,ZFF EɥSEvEyEѥ^EǻENmE4E):Dl2DADKGxG}G8C|VC|X"BY.D+\D0jDBjC0D-iCHBB)GGuGyfGCn@C~D:1C!Cq=CTCBQA.S CyCU̎B_9 C8LeC% {C5CbÂDn'G.HNHcDMyDSDPCrDfD(ZDY2E(DDDkrDCL%D2#D KhCyI9a@IVHk@H²C?DE:6#DʼnDDnD8;DwC{C1C80ÿGFPH@H8B6bCpBQCFCD~ND*sDF"@HEH=CÿDDnGDD buD3D=DޅErEE DD.DoD*‹wC8CuD!CC}CDPA 4CytBGC+B,DPcÚ)GAGzGoCBC6L3ÉQ.B3C*Sc *D=mCYC%_Cer`Th@T_U@Gi~GMGfG¨BG`C D DDD)C@B>BLBSBbw-@!“LnBFdB@C8 +E±ÇbBA2GwHOHCfI{D@DD?E vE%E2EEIEe'DDX2C6C wCC9GHH]HwDD E!E-ZDDJD_}CD0!4CACB*{`CKBCFN;CCCeCAiH@IbpIDWDLDY DjRkDօDLDFqFnE=E5DD3D- +xDӿ@HJHWI*0Ic$C=D\+RD$G<̓FFFME{E$E(DtDtLC9,@DbDnD0(ND"$D3ΏD( RC*CҦrDDH^I@IcCClAD)}D% +DEE*zdDэDCDk>DDA_ DªImHIC!I)IL]DDxD4EDJD]DxCnC'X@CCf2CnD +C;p>D/ +éCOBL@4~FHHVD,bzD+[DXwDD{D03D܈DE3SEO%DDDgDD.YByCz(dCAHA`IGH(oHi_kDUDQVD:E0DDwD+D4?D, Cq CԏBaOCCÀC=C"ˆÖ{\,Bx' DHe@H)H" cBiBżB{}AY˜C%CCF CvO8BXÏگ,|LC1HqH (H-VH# +ªtC=jkC3RDkCTC(pAIIDGDDCs_C˲G3GaHI gDc3D DpvDtFDqLD7D4CCQaDaDBqCW_C{E=CآCwC\C_CIB=C {C=CAGG`GmCDbGD&7C=CɕAC½|CCpC¹BI`BdGC*A&Y`AGGԀGGVG_›x[CytEҥÉBbCZnUB;Ä1 +BßC\C C;@Cf‡\ ƒBHoHFa@H9DDTs?D4}D%^DNWD"DED˔D|DDD/D4CfDgGDHyH~H|HDmZ|DDVcE5DDbCED7C@HC_2HCStB@D +9sԕűNLRCBPjCmGrhINw Ic6Cɗ=tC.D^`D!C$D#G0F)FZE1:RDD8D7CEGCCgIM@I L7I5ICC5CSEi'GXjGDqFΌ-F EnE@EQVDk"TD,dD7DG^eCgACBA[țC +BHzI;pIUǀC)DC$ CD#DnhE:HJGo6G,F EvED~DBJI0рI8FIm I(DQDG8!DBE߅0HzH  +G+FeFFlEޣ^E>]E4EDߥDD]puD4B˅CC/è8+HwG0H1D YCAD,CADaC_D YEHDyD#DODǵD;fB B$jDH7HaLGH!C>DGDpD*NDTD +PC6C4?D*RnBtByC6"YžCDBRBVQõwB@ +G< I +IxDVCDX]D,@DcD +DXDD0DC)DICnFCǗB\CsI(IuI"I34DD4D[DRDDCD/QCDC?fC`AICe@SBC*Br@BvCwVDCzGiIyIҹDD\DtDE+FE/EmElE2gE*D>DmDmD!D*MCDIJ6oIlPICDDNvEJE`D֥DGDi +ChC CWeD$eCCo2xCACB\CeCEZ¸i;Hc@GGCBD C4YCBgDKDDD1DC&CMCCBRGQ +G: kGGٙ)CY1CirDPCDCOCpB=HCNBE4ZBH$BKC7_B[B;CLqeC2o°`B;C{b C3iHH.@HCQqC9WuFBCCl5.DkDuD`TBhpCxB{!CJY49KGoGYE]H (H C3mPC!tBEgE)DD%CC{@B-JC\Bc|B..C'B?BUo\BK6BW9C BNH1IW`IrD-H2DI D`yDD3CE9~H')GGQF76E;E<ZDDpD-MII)iIQ4If DVB ACJQZCOCyB[1~WFQ EKCK}C_H +@GMG;0B |Cq5D~)CCC:CDƈD+AD8FC~ٙ='D8C޻Û'BqHG7GGGaCâWvBE]DDwpBOhC,nGyC-CRw[{CCD +Bo\C*yBRB0GhH%H)DD7MkD&ND:]D6fDyDtiE++DVDݶDTDHD *CCn +IcPI2&H>`H C[D-`E D`D@CĕCMCUBACBԾC$C!CC;#;CIp·CB³ pG=6I VIbC⪊C߻D)Ch ChDG;D6G0&FFWDEWDMDŖDHC5,CI.`IRHBI>zD`HCdE =GsGEF֑eFh{EtE E +Dm,D;DATDWBgrC9[C-CC|Cn+-C_5C?GlHTH:C{D0CL߳C9DmDYDEj>DKD(YC_CC6BP:C@D2H I~HH5CCDS[D$D(MCrjFUCgJB @jCʔ[HC66BCvÍ~=D՜Y{A%!HIIwIATDD\qCDApD@ǭD=pDDD۶DDD(D-DCCtC5II#IpIDzD[D<Dk/>C%Qgó{DwC֠C_C-Õ9B[OC?CwC(~B<6=C-B9H;GGCFCFDDC3VD*,DaDI@DDrDE"DKhA~4CiC%C/B玷GhGG̀GC}D!DuD]DGeDlDWB&dDCk APC CBATBC0C=BwB`ÌFCx_kC8H|E@H5@H@]rBtC3C(ACC `R8hH H}H5,Џz?BUR>CpCuCĐDؚDIDB mCw~C-+DABPkA.GGUwHmHocC]E,|^D RD+D CDC6үl&zC/@>RCÁ8?R0"C4"Aɝ3GpI2JIJD#D-:CkD0rmD=Dy,ESHiG_G^F[E;]EEnDDBATIghInI$FI:D+DY9FKUI'5HtZH0\G{(8G FIFoEl!EJEJEI q­PöCmCVC=FQyÙhC@;H\HSHVCDNDRCeD#GD:Dd*D:Dj_ODOD"C,+C 3CWCCOGCGH!Hs"lCDD_D?D|eD C!C/ DSCB{C/„;-ºYCS4/CRJC'RL B(XaBCHg!"GIIIs]0D=.DLD4DzD=D%E[HeG*TGSYFuEOEID隻DJDpII8I3;IWDLD+F;IHXHGf2F&=FFEEENEAK,E-CWA(C>(C<Å£9; <ÂSCGsGvGovC;ÄJ.C_C +CmCUD(DDK$DcCC82VC/PC>CGP>GH.Gj9G^\C%_X wBnDCM4CنB{;BCRC8CtԏBBTCjC@4&B< ƅBaHJI<`PIXC}BD/ڲC8DBDj^Eu(jH~mGnHGFEVEE8?D[VCcIw +0ICI_I7 D}DOF9I5HHzGgFEF2FHE2EC>EPsEDDnyD\iCxFSC1CtCC@nH@H`HDxD0oDMDB2Do.Doe]DqEDDDqD\CBLD#DFB0mIPI*FHHן>D$5CoDd)DDҢDZHD%CB.@QCBZCYCDh uۉCCBPjïןHvFFC$y$CWQCG{;gCE DW(CeUEyC7M” ܫkBC)GGGB@FF|RCk֤7CY]DsDqj[CCM9Bӝn*۲q¾^?\~PyB(¸hB$6C.*=C¡+KC GwIJD9DBgDoD$DԫDE5FF/'rF tE4qfDDPCǏD+DI;&I]IhJ}D0yD{E1Ga\F߃Fz(>E%E_EBWDTDMD9*CDf C%C$Ca7D)^)Ct'CX D rC0GvH7HDI oDBBVDD gDDE'E MDڼE ̒DtDGCD#CDBnI=IPHH.-DXܕDQ*D̹bDlSDDD =C{DN8A`B:A(3BCCC6B0BCXqXŸpCm2QF|H.PHN`DDxCPPD#+PCDV +DIDDoDήDfDCD6KBюC3CC VH囀I!H45HV3Di#D@^D\D D`D9CChDC$D 3Dw*Cu.d-CC,\xCX+FHXHTwCrсCWRC駁C=ICuCa+vCtDCD,CkB*HTHJHVGHR6Cj^@гDE2:DDzK3C[B?CBy00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_03_INF134_00.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_03_INF134_00.fcs new file mode 100644 index 0000000..7d46c9d --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_03_INF134_00.fcs @@ -0,0 +1,78 @@ +FCS3.0 58 33314 33315 57714 0 0#$BEGINANALYSIS#0#$BEGINDATA#33315#$BEGINSTEXT#0#$BTIM#14:07:08.55#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#28-Jul-2025#$ENDANALYSIS#0#$ENDDATA#57714#$ENDSTEXT#0#$ETIM#14:07:35.87#$FIL#CellCounts4L_AB_03-INF134-00.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#889#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#478#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#576#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#533#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#687#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#1178#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#905#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1360#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#322#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#322#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#273955#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#372#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#437#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#323#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#228#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#267#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#231#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#317#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#470#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#329#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#371#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#1268#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#273#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#241#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#242#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#325#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#634#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#402#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#55#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#55#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#248#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#248#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#375#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1011#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#484#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#465#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#470#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#458#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#285#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#526#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#426#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#654#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#486#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#871#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#279#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#398#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#694#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#713#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#145#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#230#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#315#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#227#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#185#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#262#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#1312#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#483#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#253#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#803#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#649#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#836#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#638#$PAR#61#$PROJ#CellCounts4L_AB_03#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#31.12#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_03-INF134-00.fcs#FSC ASF#1.25#GROUPNAME#INF134#GUID#CellCounts4L_AB_03-INF134-00.fcs#LASER1ASF#1.13#LASER1DELAY#-19.725#LASER1NAME#Violet#LASER2ASF#1.16#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.05#LASER3DELAY#20.2#LASER3NAME#Red#LASER4ASF#0.96#LASER4DELAY#40.65#LASER4NAME#UV#ORIGINALGUID#0d89efc2-7fbb-4c77-bce6-142f34f665d0#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#GHM%AD ñi߈CѥC0D\C.D( +5Cfa r)3Uá|C FH@H`4DXP D0?EKDD>DTDDnEDVDeE-DDʏDIDN DDR!GϏHHLkHzDZDD?D)DJDPDnD]{DVC/DNUC^;CbCÝuD CYC2@C|3ñC6H @BXCPCHD D(s DdSEZEE;ET:DD^DƳDADDb[H!}HDm8E;XE3gEE/E1EEYEGE0EhGEFEQAE+WE.bEgYE(Ij(IsHuCHȨdEFj"E=SExkEeEPEE`EXEFE- DtD-DE>DeGD$@dDDzLDmDDD=DGtG ,ßÝC`CKIpfkGvG>DED;E9 +ESDɵDDDLD_zDDW&DOND:C.C(XCCC*AFDoæj"H"C9C%CRMBvCnCw+D$/C!GD;D]p CCCBxAKCtGzGuC:C`DD DȮRDh1EnE>DcPE$m)D^cD^DwDE6hEDXDl!Di>DK9CDb:CC5DsDCCP(CWCDșEçkC}fC6C=c[DDD3{D~CgCNC}[Ù¹D BHHlDhbDE*;D^DRDDNE\D*DDq-CeC~DcDP +{Cc!H HHHDqCCEeED>DfDZ6D;CIy*DC} +CUC>C(FD"D*D2 BC[CqD #GQGhCNstRCٶCjCD 2gD ^D?CÏqÁ C$ʿCB=CN;G¦G0hUCD D^EC)CN +D 1DeCI}B;C.CnD{C-CbITCRCUB +BSG=EGM +D$D D}rHD{DDD D:aD6DD6!CCCm:'ChCjCGNHGKGY٠D%D([D2\C#DiD'qCﺟCEPOLD4Dm(CaD0BcC.Í0C3CÄ'3C +&CNGByDAۃqC֑CfwBCD+)CBBC]D=vC7+BpCzQAB?sGGECڱDdD]Cm~D?DD)ODzEDD7DQC6Cl\CcCHiHwGXGeCDBD.DDD)DJD2aCC>~BzTDRtCDC,(hD jD* zClfD%D8FC@C$\/GCȈDE4EEE|FLItF#9FJ\GF/"E:hD}DS-DLE3D;CߝIJ%E}F>EFdF_FSFͰF'G|G*ʄG nF0E[r-E28D5D D5IHIrIvHISE(EƺFHyǟGGFPFj.wFGxEלECHEJDDjDGDDSD;3DB]D3CH6@C\K>CBo=SD +DdDuEDͪDMD/CwD4PD9ƹD#H"^HYwDqD=DfEϜEfEk*lEE[EcEE"'EDE [DΕDɆMD˟wDUI25It*HXHfDDKXEB}ERETE$EHEEDDD8|D}DDCCD24DzD'I;xDD"TGr ~q?'SC'oBBLC-%_CBCJCϞB>BǷ.BY8"D/G} GFrYòC ‡aC|C-XDND2D*]qiBlC(ײÈ +<»zGrG5GG$sBBBqCJC{E3D:D2ACA]C +2bOCgRIB v^ÃCnfB5F~AFaGCPE>B~GCXB0dCE!'C)AyWC0+C $7CH H hBCDq`D] BDIX"DXiD2iDEDD2BWCOC D#èBRBtC30CÔwBNÐ`B{Ca-".ŒGAC7btBg~BbA\ B(”۹@%l%@!nCfA¥AָC;CG2+GfG4CDDZ;CqfDƸCD$BiDN"[Ay CF2xAGDGZG7GQyxC VmCLCSBIBÕ1ÉJYB|(AӨCDCBmCvwC@B+3BB[QCND(CFvBQCYC*WCADDmMDYjCpCDD.OC>B{$l/GaG7CCD{;Dv 1DbyDaDDDFDOE,=DѼ9DKDL2CCC.HLw@HɚGb GCiY.D DD(DADDDͽC9DxCD3D-Cݐ=C C{GɀCC}CDaKDUEEBE&GF{F8EE$D[DYCƬDE_°ѷI8ITtDDnEE6EX[D2DEuȍHk GY!G)I!FEcESDݶDCѾI I5=IIFD1ID7"E HqHuGrFGFIFaE(SEptEThD Eء +}4C7QCg:3xèLA-h'FDGCB(C,B3CqDD`DD8D^[CθkCӔ CCCi7C GGXC DaD#DAEAE<E}kEg(E\4BEr@(E[1DDDRDjbDp@\D-H]IGGDȮDE=E'EDDGC˭D4CժC^C/DDgC0DC`"QCC$8@GB'CyC-C-Ok3A +=/{C/BxCšVCQ' CU&eCd )GGێC,D5aKCװRCJC/DM_xD2C +CCCC$GOG̀GGGB̓+CoS3D{B/BGLBwC½NXB!bCD#C.CG/y@Cs¯~1Hn@DoCfTC.CmD~D;DE"hGx{FpE^mDDD> MCCwD_S`II?DcDID-3DjED8MEHL(GGYFv!EƖEi2|EYD͕hD IInmPI5HָID@DF,jJHHnffH GCYFF+F7&EEE7E4]C%@ZMuCZÖń—.C-CkHeCyD` A'0[C?CMCiC5 +D~C)=2B A^,@h+C1?AH1w@HqD%RiBDCCECDž?`CHpD DGBZCɉ0—"à&) %BC)ikH5-HL{H(rHaէC%@B:E4>DDJmCԄCyDCwCC/CKFCAwA=1T%o/bH+È8C{C1hBZ/D3cpDE TDDE O`D:DCmvD8D2C,3HB@HDEE:REEvEEUEE͛E|cE43E›E\ӍEyDD⧥DmHICHCĀH)EuDEkGE~DE]E9`E81EK?E-JDՏtDPpWD%ytD-wDD(CPCfDPDJ#CnQLC-DHPz@CF@]C1CMAۙC9CC(BDžCBB 2i:BH*qH=C[6eCCeD D! CDwvDDcBtB}&B CCCmH[Hz*H6@H +GÑ[t{QDCx1wCqD0C7B$CEFC1fCDCM}WC|B4BBCjCCԹHBB1-ƒ_:BZbb‹ BnyAΥCCa[OBe9gàYae FvFCU-|:( +CIBYT@LD)_BZBI|CS|CBwЊ@!B]GjaGcHFjF€B4)o@CD9KCJBXAd\a¾Ë% CtBj]7bAPYYCjC>*{CiJH1(?1C +C5CD!3DYDYYDDu3D^DDKD`D)D{D}$4Dy0 D^xPBCCHHGqGD0jB}D=D!CnD*]C +D >DEyDQD C<0ACÛ'B)CC$vD dyB>UC/D bH/COkC,CCDV|D]DELRE# +G>SF6D(DsD6C1>C>]C+I+jIc^E?pFTFFbFЂEEtHsFHjH6gGcG^/FYFHF!EWwEljEDG>ä"A CDV^BCfBHY @CnI{CAECsCrD4\)52CaC¾˖AjC,C?WxB +?9pyv^(7Bח$Hr1CA=B+LCD5yCrCDgDRD:DpGDZD\CpGCCv=Cy[GVHCXDwDDD_CDXD-CwCuH5 HAH3@HDGD2&bDDS<H^ـHG GD<>D|DpD;D]CD0ID/ D+C sC}C{È @_7$B]Bv|C|zDCD< +EB*MO%âĞB+B%CtCrCGBDCCY-CAB>f]C3aIGGGC*D_͇CD奔{B_C]D,DDF|CRB:|DAvBw"C G}G΋G~G|CCXD{ÊCJD4KC=d1DќÑOCBC>BN/l6{;ÅfCㆎ^M´(C=H:B|CC8BYCDFG/DDVEDrbDcAD/\C2CjDCNH`H@DV{DqkE4Dl}E9Ed8EzEEwSEylE"bED_-Dp\DDyD PMI+=I|jH@HLD,EOEcEDUE-hE DڟD,DCCSC,CCCDdCC DN3DcCGC^WD,xG̀C=nwA#;UC5Aܙj¦B?BGBAd1@ZRŒyqâ iHGG CӘA{mDMhD0ÒC +CeC5D`CչC0'CQsB'C[--XC + GGGWGTB>C)A=pC#5DQbCCB*%BB˩?Cg<|CCAeoB#3B(C,}CCwFDPC09~C; Q@ՔC9CD{DYGVFTE1\ZD;-DaCSCLCH*@HD}CkDD+CD E4FHGieG=DF*Er,EFD"D(CIx@IޛHdHkzDɳ"CEH$H'G0aG F(FeyF5E}EaDd_D2dUC>CVVKCu_2BC?C@ CH1N@D)DvDDEjEEIFE3FG6F=E4DDm@D>5CAQDkI4I:EESrE(EkEwER[EfH#|GG9GUFNuHE@EOwEʮD\[Du"JTJ7 IɸIL!EqD-HF]HH8@MGӽG9F}FٻF6EEDC[E8E E"E2D9UDDiDFCC@G$CJCBCxC}CNDoKDyDcDmDDuTCԖCsDkCH@H%DfԦD[EE WESxE]E EEquEEBUEmDDDD3LH|HGHHTD6DEKE"EPEȆEQD?ED>DDxM\D{D 8(CCfC<"D(CZH0ƀBÐopeWC&aENE=E+eEDpD DpI! IOHN@HDtDE&E5EaE92 E@ XEE DkDzCN +D?DruuDlCF%D0D"p3D/ +D]D3C~zGØ:B0äCswD)DFW+EM.DEEFDMnDDj{DDDhpH gH[kDDGE!DEEسEL%ElE1E0DE̹EYE%iE=wE'D߁IsIܑHSSHE +4E.LWEE[iE{1EEElEaLC@/@{pBaIGGэ'oCFD[B]C +CDNC^C_]C_Bz<©+C3fC>CGG$GG3dGMٯC%P'C~~D#DqDeٙCp@͝T B_@X )C=CIB-WlCU0CQCMM=õ)YDqG>CvX]C?CBO!CdEBpCrC^CBdA%B('B8GbG¶GD' DWpCkD.$Dk1DlD7D'D*TECC2÷NC wDCUH[H0AGC-Gi^,D6ClZDw\D5 D6CD D`OD&Uo14MA.CNó(C CZB#C$36eC$TH #¯'CkCD3DX Dx2EErDCֲC'&B5}B~C*CBvRBJFBA²NB3ÁC2ž{CɢuG9BΤBqQB?BC[Ϲh)CBO{pCBHjXGLGM*)CZBY3CjC7CQg gB3CAC&=[C*fAwi@3CJGIG]GG9CMGD/cå{V7ABl nA*6CgOB.Cpų8BϨZCABRBVI@6C%FH<Cüf|dCBCCCDCkµC:CQRoNHQQHDkE ENE :ADߔD8D0pDUuDDn$DXCY0THB GVGIH'HR C/DE3CW\E$D^Di Ca 7C>C,bC$ZRBo*t\C#YC")C;[A(OCND%6H CW5BjÈĸA}CNAB(=pACAcB3CO_gBKsGH!BSD"ջD Da=D=C*DDbCqC9A-¾ CAB*w>3G^KGG\0GIC D%0CD#W3CCD +C_HN@CAf?FB/`>CY+CZCqSǣC7C̒UB GqBGGAGGI=@BA#D7CCկC'CC·;C@{r(CsRB679C8SCo_yfǜFGqÉWBC!`BBC,%DC3DD%sC;dDDrACpUC;GڀGhDEE,DE;iDiEsED6BDѿDMD%SMD"6CܥCADdHMI-/GGDmyDV>fD2)E-DCDrjDD[KD;DR:C{D MB D +CC ÏBݤBB½ÅCHWGpuBug¡.¿PD5BCрC|hC8AH+¤хCuO#HGnyGQCDEF6D+?aD_D)DxE+3EaDDKDIJD'MD>kRC(C+8CUЌHb@HdG@Ga D DDA\DvBDXQD\kDyD + +DK!!CDCKCڈhZ&GYBCC\kÓCGHdKC RBі6-CCDj=D)DnQDOCPBRCqGG:D:1KD#D[D&Di)DyDDMD*IEDD~DRDF*Cz0ÂI,pIV>UGG΢CLCD!DuD-D=BD10KDS6DtD2ýMCzCTD/CCb§k7CD&|CgYAGAo dC)CpCtCBU0BpDZfCtAv TCBNsBKA.FGG+6(CC"KD B\@%DADZDD2B7C%CPڈí !EGG<GXtGX\Q-3C_zE\fEjDCyCD´8C9XBۉuBOOCȇC%CABh*b2C1oywC'H֠CNeÀuCY*CZJ\C,B CPS|B-.$šCGGC yBCwXD,C¿D 6DDbjCzDQ0CClCuCMD,D GT6GטGbGZB$!BDxDTC"BEџACSC[MBBB\a|C^BZCZP/Cx2-0Pi?COHD+²xYA@XDCnEVD;UB\DSC*C(P‡zisC H&aG=GJECI@D%D^}D8 +D>yCDMDvPCpC3C UC&CC?C1V_C-G%H jGG..kDA)f3D8|C:ChKpWC{C,C^CNB3D*Cw}铷DVCh3CB3&@MFy˜Z5?CHC=C`ȨBSDCD COCAC:+Lr HH+CϰDj D2D D9.DjDD_8DLbD^DuD:CQCCG0BakLG0H/uHu@H5zC#fC[DjDdD5 +D.D=CyD0B/)D+;NCKBWC8țÓrCdsBRə±ED=DDEhMEzD7qD$j2AӬCpC CI.IGILI)×DEpEEZzEȬG|G FEɉEWaEDD}oD#I_1 IIIWE4DVGPC{TCRC3¾\2k3CïDՒD)DDDDQC0D/CMCH!HI+DiDE1+D,tE|WEKE?EćEo͙E*Eg1E7""DAD}DDI1XPIzH2HW&DYEEEHoE"eEOdEE E.kC+Cƶ+C +Gi'GPGHCS6|l=DE"DDlDPDCxCFs¬ ;"&CCYC>CNLÀj?aE6E0.#EqEQƓE){E^EeEìEY~EݟDDD;+DPHpI_GZHgfD"0E E%e)EHZERmE;wE%7DEפDDD{DOuD2bCCCso@2DC,CpCD N\H*`HB +DvGE >qE@HEEBHH.?CpC"gCBgBp+B߮EsBD^KCqCGwBVhtBzG GD .CӲCwBCs +fC/+CF/RE[[Ec`DB[UCC2~CȈ/B<ƼBGGGG#DCŽDpFFc'Em;E0DDoDJHCC,CC\C-$BC.6CbD=^AaDBMGd‚FrBQCdvC=B_7ҾCh@\?_>Bɩ¾ IC$CC!C^GG.A> SCuA}}CZ{BC DC:D +QC5BFICH!CeύCfZGGG,G;½iCzCREkNCɈBHjBrCLRt2'B\"B:9^BAPHB{KC; +7jrG) ¤C!D +CfDڹDJD2EDvDwC˙CŽ CP rCg+{HjՀH2DMDAAD4DYE:EbaEWEE3Eq|EuDD"!D,/DCHnI 7H4ҀHjDOE!E$QE+@DlDd#DBD]C(D]D!2DVD CuC D#'DDm C*pCoCYbG_ClCiX"B +CGe{B#C"C,QD eCC1BC*RBQCu GG9>D_`Cê9CoG +BACD.wDN4C(Cx9hYC BC +cBRkGGGG_C`AzEP`D(ADwC3&LCBs1C=C=CEABoCmº›3P£'CGxBfA}CM:+CqC lWCA;CfBsBXCZï)N5H_gHk-xdD D$DD.qD|!Dp.D{D$t +D-~CDK!C5 CD3H'@HTH@H!A^CCfD~DD;"B3CCC]O'k*CD/ŠwEÂU3@X3CʷACeZlH`aA8ICkz@ÚCtoD~CCBcCm¶ݹCQFB5B[C.PG1GbBD9CCձYCZY «©GdG~Gj9G|c“,BBkDQzvD >uY>cB~C:BCWBLCKC۫A^Q!v Co@o%*C?Ž/=H`KLCШ^BCrC͓Da4DDEDÛDD.CnDC+A|%HGH MDnUEUYECWjD D$DhDC!CmC'CAC1qGC(GdGCW$DХD%DeDD E=E).D +qEeDuDDCD@Ds/B{XG΀HGGʆ{D2DpDRDɗjD+xDJ+DYACC$D$-DCmBB”y>C> BK CCCMCHSˀ6•5C9g¨^R×s,C;C1UGBjC,APBD@qA[nSCsGGgBMD 5aDMD _DwCuD2CWDrDDD4CJD,2CkffDI`BE`CJDB:<\-@MC;Gm$CoBb+@U+D +6D,nDTD?\DDSD™ D%DTD.)De\~Ñ$HԀHASD$EDNJ EjD*oEE;TE.EL&E7EQ-EHvrEd,oDb`DDrDV+I?I9H5@HqVrDDϷERECE +DãE UEYEJDD+?D>D3DTC-FCCߙD)v*C{CHC WC#BpCcDÏCΚCGB?AE‰`OG Cj ×~GhGfDBjtD4RCGDWBןD-cD5C>CzC )AܧBZ]C-qGD:GG##G: C_CB#CXǻ ˜ ÊC"DQCD @؃BDCCJ>tBk@ff!d[f•Ca00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_04_INF124-7_00_01.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_04_INF124-7_00_01.fcs new file mode 100644 index 0000000..24ff036 --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_04_INF124-7_00_01.fcs @@ -0,0 +1,72 @@ +FCS3.0 58 33331 33332 57731 0 0#$BEGINANALYSIS#0#$BEGINDATA#33332#$BEGINSTEXT#0#$BTIM#13:48:10.76#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#30-Jul-2025#$ENDANALYSIS#0#$ENDDATA#57731#$ENDSTEXT#0#$ETIM#13:48:37.88#$FIL#CellCounts4L_AB_04-INF124-7-00_01.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#674#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#356#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#433#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#403#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#537#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#922#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#712#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1119#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#329#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#329#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#271339#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#351#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#412#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#301#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#213#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#251#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#215#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#298#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#447#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#315#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#354#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#946#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#258#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#225#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#232#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#311#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#598#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#415#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#56#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#56#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#241#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#241#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#272#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1017#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#479#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#464#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#468#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#464#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#287#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#519#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#422#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#667#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#491#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#645#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#286#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#407#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#714#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#784#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#142#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#231#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#326#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#232#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#187#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#270#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#967#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#529#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#274#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#590#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#476#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#628#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#477#$PAR#61#$PROJ#CellCounts4L_AB_04#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.99#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_04-INF124-7-00_01.fcs#FSC ASF#1.22#GROUPNAME#INF124-7#GUID#CellCounts4L_AB_04-INF124-7-00_01.fcs#LASER1ASF#1.1#LASER1DELAY#-19.525#LASER1NAME#Violet#LASER2ASF#1.15#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#20.1#LASER3NAME#Red#LASER4ASF#0.94#LASER4DELAY#40.625#LASER4NAME#UV#ORIGINALGUID#43d13e57-fa4c-42b0-965c-43a2dc3aa6c9#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00_01#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#GhB"ClCݚCCFC:D^D'BDOD9HCBkPCB'AnH'HsDM-D7'DDDy]D@DE1DHRDFDͩED6C, D.D:dDSB_H} H7H#V@HyKzD`CʚCD8 3D~D-zD CC6DQ$\C\Cn}CuC5PœCVFfçlPUÃ=cCGYCEuDboE6E!EF3&wFLdFGGТF`EME0|DeDĊDyD0I{JϪE`Ep*EEETgEfyF SHUGGFIFeENCABH̀I Hb@HѠ.C^D\ID3EGCDDˣCDVDԎCaC5<|A CPëD^D]CCD&!›+%HHCˠOÎBBJC~DDkDTZDDD~D'`C&CLD= H ?Hc]|D ˎD;ClY"DD[D DhDۉD'E OE_DE +DNCDiݸD$2I0I]c H1@HC xDqoDGD8D¼DHD"h:D{IDaC;CytD-;B7C hC'$C[RCəB CCC6?DYH} CnAB'C#xC}A9B3PbQCCDҗxB˯-CҷBGGClC+CVClC;{3CN=fĻCKZC*C7KCmlj(OQpgGxG,GОH 7Gx]+3DQ7B(C2K»BÐ~'CȣCV7CǘB™qrkØ CPPACHxXCC?#pŠuRDhC|CޥD!DGDnCD4NCD CŴCwHGHDM+D[-_D+|D>,D3D#wDߔDi>DhE" DD!DMCvCCHAH +HAOHDZD&DA3DuD(SDS!DA(D9KDT}D79°CRDsZ(B eC(C5&BiS3Cr(Ì_BrC[C +C<[ CB'wC/OBHnB7BBHhH+C9iDH7CDLGC]XC CBDCKiDo^C "/BGá³9H%H.AHHB2B5CEDDvDjSCCD1R@5JCgf~AﻶB%#ZN—=!C!rCH|D@†CeJCFC"DcD݆EDPES4DڴC+u:XB=~8DWNI IvFDrBD vEfDHLDrSDkBD}FsCEqEHD mfCC /i/VC\~I`PI5I IuaCCzs'CfFF#cEE8D&DDPNCwCCCȖÒC=`mÎA :BCRL0zEPCtCū@ÎvhI"wDNZDsCؔD5C~̥CCLDCCB!Ë=gGH{DGpD-̞D#&DT]D/5DwD#FDuDjBDC8D#D9VCCԇGDHAGH`CwOjDD\fE]PDěDWLCIDID<YC,FCbCh|BGC*„5`xB@vH I&DD?E>DE NEHiEN5 EE&]dEM]DDDC27C̠C`IV-IO I& IcHDvD^EDYERDYDَ1DoC +CD'DjCnC3CvP@D(CÃCxtGԗ +5 +4BW,BCC*==ØB{ BC5ؾB01/“.GoGn)CCz>nsBQ.CRgBXxÂΩDurCBSC*'FH-Hr DPCDD}DWDWDݏNE|EHjECnFE/EDkD<[D%y"D.rHn{@HHKyHCDWD8ECDgQDDO7CD +D0nC~CHCQCaCGp +C ^)CWdDDfCD@f%cEGz)Zø €{C7C3D,PCDjDCB}C,CC(ERË.GGȒCmDWD[%DCɚD4ߤDGD:Db/DڊDDG`C0CB#}TCkHʾH0GG!D8 rD|D9FDCqC*tCCD1ÄDBCC3tCZC~Z%B_G6BC8D*%DDbE>GD, +DחDƣCl8C6]C{C4@vC2I8IwVD%*DԣSD)DE;E,EERZE2 EHDtCˏC>(hBCZԦ~IIIGYIռEsE17EE=|*DgDH"DDzQDH>CNC DUA& B~Ck?B# +CS;~CswmCd9 GfCoC^CCDH#D5DP9DVCe5ޡCEkAIe&Ch:]OtHcπH9CzC/D +D%ID[DD%>ENOD DDz;UC+[C!/B˜EH)H[ HuHAaǏCEYEZDpDDD|=DpOE^DE-Da E BH3GGj7hFHEE`E{DzD+2IPI5I,vI]RD4[D$F}Hߡ}H_wHGG-ulFUFF;EuEFE7ESJJo0C ܬC)ÞCCØAH%A@BIC@]B ^D ԄCkD-CCGD1Q^D C*nCsCC GHCPDzWC"D9zD1NgD7D:DM7D%DD+RDaBD +DnEÁHRH̖H]HMDJ3C:CD&B_ODPWmCN2C¿+CoBMCMBE|CWoBhUDCԤ—Cpp7MH;0@C!B]GBFGCvzDtDg+CDeAWCϢNBQǵDiCaBn=H?BHOC"$DJ^D,D D3 DTE;DA QDHCpJCJ`D&P×6' !HHHH(6VCFCznE\DDWtCCDhB~DArRCF|CýCmHHMD +D!DDVDd3DɠE h,DDTDfDDD[ECD9~CwxIMIH@HוD!D\Du3C{8ACgD6DQ%D`BMtC7+C(D47uîӦW$BMB;2³alCD/UG% CHGCTB(BC=(†hDHCC8CkCCC8Co"zH?NHO$C V9DCؔ~B4C/ CEDoCDBCAD4CCUvH,H>ZGuH&C;#A6ٙE.wDDkB_YD ^_{C/DyxCMDB?CBɮC[߮CP<0M€:EÑC{NBC;žgCSC6FsE +D[P;ND-$nCfB BaHyH=C C6^DC BC_4)HlHHHKBC"CݑDGGPFEErcE}FDDWHDCDNN‡Cͷ uC7{CMg +B${CVCOyC =ÍBfdBCJCvAXiFq oBJC 'Cz CΉ{QC"YCCq3CD0z DCfCBGGECg>D#DCQfDC:DDYuDE]Dm.D6DԴdDb{DU=UDC>iSHH H"@H9CXhChkD3DS9CD](C9DL2zDCޙBPBD D7OCBf`' CB=BC mC?ýH_]CsICG .NCWsD ODODDtD"1C6PCCB>CKYGHCqD+RD_D\D>D59DDy TDDfDD`D3DuhCK#C~ C՟YIPIHHqkDwD@f@3E&CA`D,THD5C4CCvÒ>Cq%gBoB\C_#G=BoC"XC>C:FDI)CDZDvD(E35EwJECE|.G$LFSE hDrDL$D D\CqI.wIU`D[DDDDDOE}GG9MG|OFELzE+DcDD"IxI?ID0IojDtq.D]E@Hx_HKGp,Fԗ_Ft7FroEUSE=;EɱDKyD 4CvB6 C BLB&C#fBC Hx@T3CfB4BeLC BHD ?\C_CbHCNϗ@$?\|bBG G5>CxD{aDШD'3DDD#w6D(6D7<DVC3AYsCC_CC'GGGkRGG˞SC%CeB,DsOC By'CVIBbV/ovB1ZSD(ChC_C;xC&sByC +He6@C&m=COC+y*CCJ0`DzD RD՝D7K9B3DsCCWC2C8HUHȕD`ڸDS DVDDV5DfDI-PInbDrDӲD>DDDElHW}GGaFhE&ErDD1DnIvIZI,(IdfDOsDF1{IH"HuGVF0FvF_ EEE.E1 +1CsuCNB CClC7HgB@ºDqC#CV\KDԶCTDECDOjDԼC BGI+C 3OCygCL#GJG>qClDcDDUED3@CDHrDMw D=DmD%DL(CȬC gCQC\;C/GHHmG +GhFD8JCDDgDDÆ%1DfUC BVC5tò}4<B|9"C"BBX$EÕ=ÉstAg!CK7G-BÁCIC޼C[RDM.(Dq.D@C\FDpD*VB Cp0KC &'C[C3GH 9ClDDTDADwOD DDDu1[DD}DmID4D +\CD/YI!I$]H6{HPDDCDo DD Da_C3DxDprCwCcCAC]UCLC9}bD_Cܮҏy%#CgGfC]CSE"B B'C 3CaCRD/ AulC -h}RCwCUG[GP CbCuDd`D2C|D!DU*DéDynDCDECCuBң@v%GGnGIG>CC7D73Df7DrD nCqGCTҜC[oCD! 8)WBZBj^)@C}C )C!B|jGCPQ6NC0DBRhC{CD^!DZHDhbD2"D82CKs#~eKAHPHN|D>DDvZD DC2D+ DiDֲcE+ADzD9DCCDHI:H@HnbB D8OCI3DdD73D/J~DsD)DNCIECuC>1C.C#CBBJCBC=ið+CGCDF:pE-EjEnEmF9eBo>?2Bx DϭðKC>º"iG +Gm®C CqC}B`D*tCnyCC$1¥ܶCĢC[ԯÂ\GR!GULGG>?MECߙEWE+D^DMB:qC Ë-EBH;Bly'Ê×(NC. Cq}YvRC!eC|5BВB]GCB\BXdCHB)gCCCC-B%C"ld,BTA'B9GGϚBCADF?D$cC.g£?KAD&CC=RC.A؍BRi+CCfG)GGH C[#1BȻC3DD;5CAC)A BCy$ÑBCJIJxyEEE,EEEAFE+K#EFާFd5FqE5?=D$%DuD1D @A:`II!JJ=JDZmD9E3G,F/FQ~E\E-Eb5D&C`ClC CFDUD/#CDnC/6DFCoD8O7HP\@D!XCs,BC/PDk D}EEDfDsD4HC;KCtC6'\ChB=ZHL HD6DsCݎD9DcDH&DDDDDD~DQD SC:CzKB\CLIPIFH HDDDD}DD`C\8iD;DX}CT^CBfCCTBיCAMCPCVzC͗C!C@HfҀAV'YB|CqvB0sBnC|D=C?өB*B]2¡B,HsH CSC1)C C 5ClCCYDA5B,BD7BbC~YCLAtCroBD9FD:CpLD}CCJ$~=HH?HL@HV#-BȞCEFDVBD,Cʆ~BCgAL}vsACBdCC+CueBo HB +cBHC%Ž_Cs-Ck0B)33CLECBrT3B¬<‹{ʹG*BGG6cCoMC]g+x+DCCdB^]DxD%C͡C_CCuC^,“kBwGCG`GG&ecATBtCXfD6CUC|GC&Cw}B̻BwC)qQK7DŸeBp:C UeB:қ-.\C'GvC£]B`BqCjCDj!eBDrBCG6CCVwv@X?CcGހH9D>D:6DwCz`C\D#DBDR4DC1D7CfGC DDfCBWCboHZ I@2H 0HO Cz˦C +DaOfDkCDCED C4PB*CAB4C4KABxIBC$yB@Ep*HCx:G+Ã+ZB]B#(C%jC枃DPjrD/D]f=Dc)DJD@C[CNZCm`jB_H@HT|DgX DXC)bC3D|DCDf[DD +EXQXDD5D-C D/CI3[IzH6HyrmD4rC214D'D)DLJDC%Dsj_D0@D87Cpò@,CByCAKCC|LC[Cb8’%C [nF +4BkC8WC}DјD !DaNC DDlCR$6CBByB)BeHsH.CCiDDiD00gCwB2xD6qCC8.8CxDVÌ)B@ӷCqQHp@HHVH-QB+UCݼDRDrCW(CKCBB[kB+Û C=] C mAiBdzB`L!{#C/BjH*@Aᥪ^(CusSBCD'D9"DDDʨDC7D"C`CVHQHlDDD!ADrDF\D+ DeDE c(D’EHD@hE[D*D %DSH?HJHF]HiDD {DKzfDD"DgHDv"DCCD[CCq@ TCQNB߫CCC]A-iBϛC5|GBCۻ'BWC>(B/¶1 EChBOED.Cp$%oHB2׊|Å8GWH +CgCSDBD(3C_-HCEaDbD9C~C%CcX^B.HH)HH!?!CCMsyCMEvkD|DC,վ$B>ã^A"C DB-B xkNCB+B ʇFhD +W D_EEUEEAFGVEFD qEi)D9եDh!CADBIDECxpI,IkDDD֏XD1EzD6EF(F,*FXJ ԕIpI;gEDjyD@DZGcTFYFExEDE'zD!A?CPD+|C:Cgn\C/B!GOQB*DC!GCS]jB[`BٚrC n°/CHeqDiCKC CBEz§e㕏BU3GG NC3C'dZC/OC[adBCaoD PC.BJNz6D%Cڇ7C £kGqzGx|GxG cC,CTCDED.aCCRIAަSqwC<WB C̈wC5tDB/xÅRB^3Cv7?cEGCIBC4`C랢D CRD{DA=DOW%D;?C$C`ACnï C_IC2G HCmDuD>D<"DDC:DӳDYDCDPD @D"UJDC5>DCI)@I}HoHCCCyDt3DC>DrZ6AŹBD\e %Bޖ8WCD"CqLBn&C(CnrDeD:G9CC)C\D CDBDXEC>ª]OJ CtCJ;C5SH4mD}2BZdյCsG2B&A)kC@CwC9µ/Cz7BUBCELC sG>GRCW1D nKD+2myjâgCSC3+DD6.DF qwAC*GhACyGφG_GgG,BC/C?D$6CCCC-C1@OAb +ÌC!aYC΋CCXCIBR,BÆȴHcBVC>CDKD]DgDDRD4DTC)D)CC +C#BH!7BC,kfH^UCC|dhCQA5C6CCYCD+YDVCCHC`߳CvC\GɀHxDzCgC!@fDDDLDDD@DyMD!`D"YCCJ)bCPHIH#uHbD]4D%DmEEDWJD5:C3CaoCBxCĩ$7D9jB +C:-C_Bx GD~C2wC^{CLG4B;CIC!DcD?b2DUD'`DbDBBIbcBB|C>C.H`HCCCC^C3CD +mDٗD[WDFCiZC^eD48BV] QlHAkHG4]HHCAA*33E\E;D[D9Cj_D ZB?f:C|^B C}w¶ClÕ4C/C-CԖCHX¬9'CzXCBzD6uDӼ E-oEmEYG%IF&R=E&dDDgCC+AC(IҰI+DlD.6D|DiD3D6jyE\gG?G7GFq/EPzEGD4DcLkD)ðIf$ IIlI.5DD1RDdy(EsHH!GtF-FbF]ED+E_j{E!WD1DGC+C|9Cx-uC=S$BB HO BXiC%"}C7CCxC4œClgC^";AMCdH H[6CϡD&bD5D.CӔD*CDBzC[DcdED.2C.6BzDC(Ba^Gh+GSFHRHCv!C3D5ܝÑC_JCCXBC}C@C&C9 CBC&CoOKæC}lCYACuC>{BB ÍSY0H8CMiCw|ARKEE~-EEFiBb68DcD)D\DPjyDUQD,=CCjHC`I GH nCaC%C3DDD@yCWCDL,#CC-xÁ: zCE.YC/1U>DØCCC!±H}dÞF4BwC/%BgxCsHÕCV‘PC@MzkBÔ.6[CSGbHKCUDWD{D`DTgCD+YCЃJD mDC!CDCpBMdH@H GsGHD\^D:C1,D +|6CD. Rc=C2;DDKc]AnBBFPcCZ@B"hTC][G]#F`BCPBdCR{CwDf@ED HD5DBCGBґClC":3YC Hz!HHDRD/)D DV}bDG3D|DADfDdEIDQ:D3D4ƇC8C˫H`I-HjH;VCCDXD;%D'-SD?#CD]Dz|6B?CT€DJClK5CBfC]ICCEB?B`J4Cá¬:HlÇ\CcCCl=%A'\CCCR=DmBBOMCsB3-ABqJBkHC +HbCD2E]D{DDDjDg%DvDDkD +"C8CVr'[;C)RGb1G!H"HsC8nBBBE-yDmDYCoC١DjGBAf:C=-CB }Cl}CC΋0Bϑ +C`CSBiHC@C7aCDB4BCݑCýBeDʞDD D/OC,C̡OC]k`D 6AeLH)VHD8D?D=DvhDӚDTEERDC9CTC@C{bCCeOD?BC D!CHH@B[1Br&BږC@D 2CB=C{CpmB4wC1—FվkC*G4H 8CC0D +:D+#B'33Aӄ0m!D8'%CKUC8U((k@BkHnHnHHUAC:™3DD-Cf1CaNä1LBCoBABrHC3QȮ/Bb2BFCT:VŸjCC,BaªC}CLGOG1C\C*C3^CC)DNCjCEC wDkq­eC5K;C!@dRn;THa8HgGG#r C$`DCLköC3B=C8B|Bx AȤUC)C+OCZB*ٙ,c6AQpH؀C}~CVC[ +ClC^tC 'DDD@DuCSA>rC<{#AC.C;ÃCCF^4C&C"mC C(nCD#rDLD=D8ZC\CWChP_DHnB+C'CbDHHD1D)5DbDvD3DgD%E"IDJDCCؼoCNCvF2CHH:H H1DY_D]DE"D8DDCnC~DwCTY1BPBݽBˆCC9ĂjAaGC|1VcC) GRA?¿Q=X2BzNCZ]CIDDRDn7#D\D;D D,BCrSC-HgȀHCD[3D-DcDfDCYEX0DTE,E9BE)E$DΎDCe#CűB6G:GAH}HD DDDojD DqD$C}DTCRDBPCKAtCCD`CkBu+jFCogGӭ7dCS6C{BW CBDBB=CtvASV~B?ÆPG?G gCUC]fCCCiDD C6MD +9CuB} CVCEBRCCH>BGThGiEGGC3;PCtBpD4Z7D/0D +%8UEt…~BC@5\BM@C?pC%2J w}C?B-KE!CmjH @CEWATةlyC}D-5D*D!5CWYDuC@D@`CYSBECXCɓHրHۻCgCUD*C:DDDKDD9E-DDGDD#C@C.HzP@HG!HRCCD8fEvD3D +DGD#˘CtgsB" ›EDC ,tÒBmCxN|{D2A4ChbƒśHlC/CmDs DECEdHmE˂ElGsFE EDDWD*DII4D%8DD-DmDDDE8Hu-GtGFEVQEED9nD +6III IF|E +DF]sIH¥H4\GyG7,F_FlaEVdE(EBbEWCB€#Ñ( BȍUD.CH +@6CC~-CKCCбCD5BCBBA CG-C5GqG55B{=C4D0RBgBvwBm#D'VDKC]C{CkC AeVAlC3"GtG3GeGy+C0ϸE PD~DZxrCBuBx@C|ZlC8Bv‚ACEfBeAC#CJ>?Bb^H(yBdDxqDvqDucE8D֓DG\DWCvC`d!COB4@vCP"HHD3DuDQDjDgD4DDLBDDZDӍD^D{&#C'BeB;GCŽH`IB_FHyI\X…xDC7HDD-D@sPCƱPPDICuTCACuC)BMC ̹CE80CR:Cz+00000000 \ No newline at end of file diff --git a/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_05_INF019-0_00_01.fcs b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_05_INF019-0_00_01.fcs new file mode 100644 index 0000000..49c2f3b --- /dev/null +++ b/course/02_FilePaths/homeworks/claude-chew/data/target3/CellCounts4L_AB_05_INF019-0_00_01.fcs @@ -0,0 +1,93 @@ +FCS3.0 58 33335 33336 57735 0 0#$BEGINANALYSIS#0#$BEGINDATA#33336#$BEGINSTEXT#0#$BTIM#13:41:23.34#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#04-Aug-2025#$ENDANALYSIS#0#$ENDDATA#57735#$ENDSTEXT#0#$ETIM#13:41:50.51#$FIL#CellCounts4L_AB_05-INF019-0-00_01.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#710#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#377#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#469#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#434#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#564#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#975#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#737#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1069#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#334#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#334#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#271701#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#352#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#412#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#304#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#217#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#257#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#218#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#303#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#461#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#320#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#359#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#1008#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#271#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#234#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#236#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#318#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#602#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#372#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#55#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#55#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#241#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#241#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#286#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1013#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#483#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#471#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#473#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#467#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#284#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#531#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#432#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#675#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#490#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#677#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#286#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#407#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#700#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#693#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#158#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#245#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#338#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#238#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#191#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#274#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#1022#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#524#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#243#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#616#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#506#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#661#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#514#$PAR#61#$PROJ#CellCounts4L_AB_05#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.47#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_05-INF019-0-00_01.fcs#FSC ASF#1.21#GROUPNAME#INF019-0#GUID#CellCounts4L_AB_05-INF019-0-00_01.fcs#LASER1ASF#1.09#LASER1DELAY#-19.525#LASER1NAME#Violet#LASER2ASF#1.14#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#20.15#LASER3NAME#Red#LASER4ASF#0.92#LASER4DELAY#40.725#LASER4NAME#UV#ORIGINALGUID#931f801f-77e4-4c4c-85f4-9ec001229fc5#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#00_01#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#G~{C].@0CeXd^C[C&C LCb½pKv@TzCGQG'A=0BڒB C'VB`C9C qbB{' ϸCd£Cy/BڠC3GNG?BG6GCZC/\!\CDBdBJMk9CGtC\JC +Ca8a-´) 3BBRB~GA;C{ˉ2c>„m8Cx@CA%C +BK"CAR3BA{B؞C.GHGBC;P¿ALB]r&-@B,6C. G[5CG}Gf8GGӼ{BwWcB)D@D#QCÑA:1C''zBAVJ,B2JBB#¶LuIBfCB~AQCZG֭B&DcBPC DD'D]DDhsTCuB#CXRCˆC5HdHwDTD `DDqDxb>D"DDUDSE+DDhC'BjBC'EHI +MHHD !DQcDT7C8DY(C9D$JC|3 B+CÍk[CBD[!êCx1CdB eC5*C?3CGC) oB(Cv\nCZBCC'BA*8 +BstHPhH^,CEBCrlUCOC7C?Y!CVCsCA$§qoC7(B›7KGKGD9Hy+@ƾGH5HNTH`D$)OD)gD̸DBDU%DphC CkC0C<@u_ADEC6jB}BC%YCNcH!ޝo%C.CCǂC_RCOC-b+CA–eBqCOC&yB4`H6@HHHCg ADC uD1DDD*DK%DCdCCkBCB'Bt~H uH4H! H0Cm:{:C)D$D?D) CSD(LCCCoB#WB+,B+mCAʆ3CCFBGkôh[GAC$EBGC6BCD4tTDJD]FEXDlD &hCCVJCΒIHI;DD[ԽD-ND^$DEEgYG +GF:E!ErD&DDTCII)II4BD DM)Ev.HBGGZFtuF+8F*pEDmD0D%DyEBތC]C*tpBdCi3óR=Gl?rwDC>C*C~TD-)Dc"fDC.C +C{TCY8@B H67HD[3D%DWsDl#DΚDgDQD D4D<@D]D_D}yD]&DB.Aj}Ht,H H~cHCzvD GD3DDE5C˔D`DD7UD/2gCA,C-aB|CDXCrC؛CB_C`8NBDCH,\@B7CDBAICu0LD](DD) +DB.(D,D5jACQC|NnCC?ؖ“%HHfCD`DDDD'E^Eg1EZPE EbE7DQnCDCGꎀHQgH`H{DmDDD_مDUDnm)D$ZD<^D.RDBpCeCC-LCuKN?QzAC2CC-V JBCB¹DG#CJWnD2DyDoDkDlC~CxsC^hDQؑDiAH_I GH:/CJ&CL!C*=D#DrDO~C"mFBrC2tC^a?|CD[!Bg{;A2i +€L%H<CUWADKqBHmCpՊC8+B9C(\)C +ԊgdBAK,qBjBWHH#wÍC2DBosCtC)πCRnD~%C9HBfCAC8ABj{̢#CGɀGHUGHgbyáCec COD)D`ieD +9Cۙ\C$?CM(/FeD0%!?C C¢DiCC?C=A2;6.kHr>@bzô @C*CpmCYC`C*Cr|C 8Aet.jN_~bLB>"GNG6GGOB~ +C9C6C_C\=C(nCACFa|w/B`}<²v>'{C)U1ECC&L@}SBD^GxCpC$ȩCcbBDTCUCC+C/ݿ)BVåCEkAGSG-C4.&C)ʤNB|F>C͛2B0N$_3'CE™ңCLG%G}k]G@G3%CCmuD%CMxC)BCMOI1C$ËpfC:C$oCsý\B?}_CjG{B<#QDDCBQDDjDdgDf>Ch`+C-C%G1CQC\2uHH'DDyDDw +D'{DE *\EDDӼdDCrAD,4CԿgHI Hu HED WD^xBDx\D{DDD))C`-aDI %CLCGv_CڱD&RAqyLC\LBZGwFdCPlCH>O@iBwB/O²~e#=L…Hu@ìvCE DCDLݤDCɁDrJDDDF DDܦDCxC CHTDDiDEED"EEP_E E8D>D5C[HHDHgHB:DtD6DD6$Dm{DDwE9qD5CDRD DCHDHCD{wDH~f@6wC]Bwj"Cq H4πCsĘC^BCvCoD:C~D#HC!BO\C׶~CdO5CU"C +C&:wCмBQ@?dBCȮ̑Cd)Be sX C{HB,BH@B{CCRB﴿C)CC,0B^C(9jOG5Bwp5Ä.HFHgCD~jCw+C-C.)CtC5D C,BCc^CW>@Ƚ.dByŠǜGrGfoHdH$?[þ-$Ò +DAD&DIV×~C;CHBbCR8 .?B҄BABCLCJLhCTADSGCDDEY/UEoOFfFvF"kGFJE*[Dc)D-D0D4C狝IwXI,ED6E+E3EqptEHE;G5HG9vnG1F (sE{1E3#DGDwC(ICIwIBID7_D68EHHGF?F~FhhECE+mEDlDEoIEFDDDiDKD7+D#VHUZD-D;DNDwDE1~DD)CCSd f+CMC9ß`OC^\HBH2DqhDD[DܼDlDJ7Dh3DaND+DDCƹCCU^Dd7CIIX`IAJHHbD DiD`\D[FDaD*DCxAC~D-70". C0DgI.CkC3BR™ä}BF> YC`qBBbCC D[D7D~D%2D?gEo DBnCkC}8H.@HqC쒔D4CЅD,6D( DUϫDcOEeLD\FEv>EdE;mED"D?CIHxHeHjd@HDDED/D22=D0DV*DkDwDhSE >UDiCz!CbCGC?cC&D"D&D}yC:BD:GCzCQ¥jn BC zC~5C.CCD4C%BG IBJëÑGH HJrO*C@ÀIxBCBD3DxCCCCB@¢JB*BNHHH4 H8NCEsBhA8RBACjC+)A(B⭀CEXIjC;Cs*FCyC04{DPB`CGGhiCTC.iC"CD(^DnD_TDD+3D֘C<BCN¡C&ABBߟIpIC;DDkDCDr lD}gDCzE9D`G D&CQMï C4CHnHUIITs0yDIDfE +E4~.D)D&C!Cȿ` Aʪ8x(DBCO!__Buh[BC'G-D'sBCMD 3?9CHD$DfD=CQDϠD2(FCK}C^7CSH=HmDgCŬDbDDJsRDDDS0DiE=ۡEKENDܙD*fC'C+-HHanHl@HB-D&.'DDCVNCklDmDZkC#*10äDCMD6{QVjBCƇ[CCވC|GnLD)CEKE<{E +\E=\FL"IFcI{D2 DkDD8gDnDQkEALpGFבFEEbDWDyCBv IZII>IrD|©DEwH!GG8AFw|FWiFELE~?DCvDD}EDAbdGª@pCgÀ~lgF8xCn!mԜC'|CDDD?yD]CGClB_02CgTmBޯC@H H2DEEDDD6gDxDWDTDhZD՛DDrD{CnC+HvI8HY@HfCD/DO; +DC-C/JC{CgC!›DxBdCӥKCUC>CiC܀TC%ÀlC@5üH\T}{0CZ'Bصiy4AVA$A+Aڌt¯?]üChwCXBGZGjCMC CeCSfCAO'BBH*C(!BUCCb`CDG:3C(COXhoCsF+oCWHHpH 9DADDD +?dC CzCplC3CFKCCCCCzÎC;CaGfGG8H;XHAAfCChCCRCRB(B 0ChEBBC*C`CoBckvfA\B% UH=Cn2BaD`EE`ELEEG0/F#E".4DfZD(DRπByCKI*ISI5aIaFDBCrD:DҨ)D@D Eo@GB.GB$G`F{E^_EDZDZD1iICXIͨI4pI>~DVD/_EHSHkGFpFCFidE/E,E&05DǢDƹ3B?Cj D&xòg2iC +? GD7_CӠE7}6EVZFEtF ۵FxFFDEDBDYgD5DWHaD5)ChIIDbDaD֞E iEEEBE'GvFp=FEձE(D߆DCD2{D{IIQ|Is͠IsD@G*D?yEnHGG5FXF!eF[EE )D؜D4D`LJDD?3DUDGGD{dD.!D-C-H8AAܶCn QC5 Cy1BVCEBCp}šACB,CgGAG1G'9Bë,'B.C$ÝLC-C:D ~BAeC/C!yIc&`GJGyGmGM_j +A/B +=D7pDaÍ~CȆChB2gCnBLt]C +qCp}BAÅgA۴BBf]¬DA~GbNCM*C%BC`CI8-BKd\BC!}C{B&yBABi6CPGG*tACmDD-sDMDMD*TED3jDSD0DRCB⤷D:i;B$GvGٳHHD]7Cx.DQHD˲!DfCC_CBˇCCqB_CTC-q†4BnIDC٢CPiB@Aq,BcCĴCCIG)G'yG_Goh&Yf}BD]C5CDB +CS|CDB0MloCBBCC=rC&JBuGæCC79CBvC&[DEC$d{D>C;‰3C@jC^!Ï_$HSlH"CLC`DpDD r`DS4CUDs'DD oDICDBKC/eCCrG6GIH%HSwB?[C>D2{CgD7ɭ zCmCD OrYD $i,BrCA[™@~&>=%B=B(^ý?C)G2-E{ÆCtCJkC (CD|Co D%aC 6ѿcsAR·\ f%2GGG'CP@AC5CErj)C_QkC,R4ç,9FC$hC5C NB޷GǀGLH 1HByC;CCC?x;_-2> ' +ДBFP6CC£oB@C84B#CiGץE)CٓBC1aCq?CTWBtB^CBSB“"jkG`<Ga;-CcwB- C'CCC;SCZBĬFϔC:ŒWBQc GHG< Gj&Gi'Y©)C .BBCÑΫ?]C!BCխ1zBrpC`6C +H~@CiXÛCEC1BCCbC۟ACk +BWBdBOAA)x]GӀHC{Ĉ¡1DC3B/PCnCCC,[`zC0R‘p]GG}Hn@HC1'ClD#D1s3E9C^EBE@ Bu^ CgqY_B~&B# B CBB(hC/G3A'CDSYD8E@EEÃ1E4FE[DEcD/CJjCCCHϘ`IE?GFrGFFIEFZGFA)FE+E$yDD4D""IqI_]H]H6CV\DEH4'G*GC?FF%FAE|DuECZDÿ0ÉCU 0+bBkC{~C,}NHsAؼBpסBB\CBD_pD)ӅD^ZCCCCR>Cu'V3C@HkwH@CD,HDw"DDD ErE DDxD/OD,CѶnB}CKJCGlGؤGHnHD5VDR)DDD-CzCHPCEC+DCTD*PB FÀCQAٙBZ8DCYBUG*CIUBaB4B5CQAC~CÖCGB C(kBv gƒC"GHtBBBYCHq2@ì{@PfC—$CED +DJCk;D&CҍC¶B:3kB1Hè`H̬C `G•nSbnB>DSD%*D9Cj0C[PB'9A"BdKC}>cj?H&H-{FH*`HlXC*Dg`^B{DZDoDqC,"CwCClC˒NC1}¤.4RqeZC\R§;WHv@B@¦{a&C:XCDDC2DM+DnC9+;ÃmCCLHN(Hx#DlDDfCڊD{ 4DrD DBDʵDbboCӳCːBB]D,tVBBHI QH HADAt +DCͲD +DT DֶD6DICrCBCJrBA2D)5B +>C>A +=|z#CC5&D^HOA; BBy>sDCۑDTsDbDCCmCº3Au>ClCeH`H;D8_=D.D)dCXCMCʫC+EDDAEC蝽BCbN` 4TCD|0CUH @H [HH/…y >CDEEzDCmC`?BxNe¦taBLp@:CҸBn۴\Q#ÉY.=HdU@˄êB4i£@A†*CzC]Cˆb"TBF>C:j5GGCBÅ?|C`CHD#}CwCeCIC6|C$C4ޕ=kCRGG GGC CCaDZ?DjC'4ABB%ICұ¼2~hpBJ?BvDCрA/CH,®Bx!BHH@7a¢VqC•@~CKvBxCHC:%iA]iJ^ÿzǙcC IH@HB~CEC2C\RfB/]CuSA!Cg«C],CtCSC(6VC2GcGX6H%H.tBBCUD$/C3CC['Yi~/RCBCB5MCfC B0B3‹xlC6>GD*zC jޭCD#9DoCbDD^DB !DY0CÌ}CHCGHD>fDCHVCKD.DUHDDvDDuEmE:QEߡD׮D_;D8DOHH#GQH">C*)šqCH,HDdDƩDDqD6)DNDsDpDErDE sDLDtD?A,H IlHJHDD:D::D.D*CQDC:D D)@Dj;?CQCCbLCDD!6B |)BxBP|C5G1DCjaڛD02DhDpVOE1DͯHD&D9D]DoCtNCժC-êXH.HD2FDED$DKD gDVDwE MRE|ED\E>DDl :D@ H8IdKCH`&H4C~ +CٽC=DA`D5vDHkD/D' `DCIckҸD-"΍UBDCDGCBBD<5D@-HobGC[G'{T?rړCȆCT{`BhC +B%”]C,CjXByp3C4S ^ GDGFrG7HC1E9B'C#DXsDS0C:CZvJ]Bý0VutA˕CxClC`AÓBNC.BvC Úiar;G܂C,pA7C@¸C +C>CBl[sBV±eÆH@H8UkBCsC2/CYc @X£EsDLD z*Caku +HH)D?DbW6D{DyMDWvCDM {4'CsC3Y.6CD:{B!(# upBCCM~H:@´8{aCC>sD\ZvD>0CDD3DDt DCCsDCCC1HΩ HvDvGDnD;DaDIbDEYEkDENE&*E^D ~DBVCrCIRI +NHILvDD:Ds3DmDDbD83CkD>TC=9A +B0D#pB^C'C_rB)CCֲB3^D9¥Hb@B6C#Y™CGeCNCfuD)WCmMqCoCBԡvhMCpBD$C5AQH*@HsCn]DtDD(eDFD? DDrDuCDCD-tDC&BmGGrH6HCp0D)D7DWD rCNkfCqDORACBxMC!A?˕¬ CCdCzSB5CToBNC!;paFLG¾fCC!-CCxDD,f>CSD#IDzColCBm ^CqBHgHDhDc DDDD!DD;kD,DӟD!-CD"DxCAZXHfIHHt HRDDDq)DfDݮC^DL,C9KCCsC;UC"H6C81BgD؄CTcCڠAqCC +MCxWC=CFH$@Þe{$?qA˩CUCܥBCaͥB,B?j@BA‘v« KYGgTGigC!`3FCCҊRC#Yj?ϸBZ CzC^CedC;, DOP(C-*Ê5GFG:GGq /? ?DB¤ =Y/EzYWCkt\@'C5^ÔB@ŰBVC +>B*(ÚpBCAGAzGuy'$BaDDE E"EumEwEG Ff*E +DD;{CCC+>I+IY DDDfDǛDDʾE0G[GFcEFE<DqD}CuJC&Il0IKIICT/D~DuEH]GGvfF^FH|F5EE#DD"mDBCllC[øACC3zb&7§(kD:B&jd>7BYCfC< 8:BCYiC#jCX +])²fBBՖpGPG9bB2&_C 5CΊC($CRCNB)!D6ʣ@еBaC:§C)r*?GcG]HqH !ËYX)B<)DzD&mC(CUGICBÝA: DCYNbzBRÝChC? +BCOchDH/ BZB2Ǯ=CCOCx0C>D /\DECIoC C4  C+tH?@H_;FACaCIO4CC7D:D,ɓB4AJ,6 COoA2-pGG¤AH?HaByaB/1CU.DDOFC RCuC%%CicC.}C[J¤BcA$ƒKtB# !GB#`8fCuHD}-CD DŅE:uEt+E EGZFDKDCbDI?D*0C'I(0ITDgDJDHDe=DDjEgjGVG%HGeE>EGE$7DL$Do?D_I\III)CDE 3HVHGFnFlFTFOME0E4dEDCD +{Ø C%xžSO\C pHd IʨC*CKDbCuDDEE0{ErEDDȦCXD CDDmE~E$EEF9E 3D/(DxXCDCqCIFI$oDweUDRH6DBDDȺDSE.GvN-F ++FEcE;FDRD D]߳DxIQ0Iq#II&DDEqH\Gn&G(Fn$F FÊD$D?DC >CMBeBG•ƏÎNjGCbGB:Ə•C(FC[l®BD.-C8C>[NBGJCgBxB GKGNAhCNC B'¢CdIC|nD%CYwBBBhK. GÚs8G +GxH6HRLAi!GD-CA@C|C uC9CbCWS_kBMPB F!1 B@›BIoBGC}IC^sDiCjFD9CDM 3CϙD + C2CTdCBB4~HH\mD#DqXCD@C{4D>pD}D=IDD~DCBD^DWCSD>BktHy IϠHUBHD)c D7wCpD(DfDv:;D,Z&CBC<4A%TÀXA9BKB>=%D4Qu1B~OCCHJB+CFCBCC#=CCCCnBSCBBp.BB GG B@L C>DD/%BL< DjDaCB@CC5 +<ƕ3@Cw~CYGGj0GGA'fC|C6D}AfDb CSY:\w„8C ;BuAdjCeA%ê@D6f—WC)òÄA7HarC{DTEEoEAjEV:EFGm*EFnEv6DLWDD@wDX|CjC5bJ6JEyE~rEEbE[E`aEF|F>g^F0ZEgDD"Dc;Dq- DT@jC [InhI:J*JD6KDEfHGxyFcsFeEtE1TE7zDDl;DZDqCMAK'jCCBCQFGCCÉ$GCI;C]BIWH2B8C9CD{D`VCD +BC$^2mHCmjHN@H^D<5DHIDrcDZDDD=DaDD2D_`/DAChD([C:CMAHHHJH&D&kDnDDE:D@CңD0#@|nDd|Bkb[H/B9HЯDK@C#WAʯBYjsHnBGJC.!Cj CӇG7#AC@QDQ(D8CőC\DVCB_CuЫC_C|5+B|L BcH@H,IxC>#' +ىbCDECDzDBiD &C CcCX8C&O7A!#CS_Cq'HHͤHURH[[D6lC`D +D*hD;|[C1UC(CȬrBqDA>CC累CeC<1zCBhìLC@BjCH17@CgkCmhCTBmၘB; C`"Cd C6CpC'(pd<Г¶cGG0B 6CÞ#B ga^DBCECBBCfC%CsCC +D*DBRC|O$D_r^WHVkHMvCCvlCZDCZqAA D% C6BVN4+²LØVsC# GG9tGnG <CBCw{DhDbZW>B7r;+C5}CBv}z=³m8^2FCGSD DME5uESE`F(FF>GH}FPE^DwD1cDzsDGD +DˊDD'pCEӰY41CUC&PBbCDmD +D%FC'BdCyG#b2× HrXHDZ:DD DD{DEZD}DoE hD +DRfD CfD X}HZHNjHAID]>DsDJ>=DBnD\DC 1'C'xCQg.C pgCOkÞnC D|DÊCt[HB0DC`qNCh?DsB'pC]C•WBFhESDېCZCȾ_CCihCH`I%E7FhFDFeFYEUE0NGwGF +ES EhD?FDCy|DWD +'IgIHĩI PDCsE)aHYGGrٍF FAF06EIE2DDDiCF*B U^/0DCqrCtC+BD>kBB pC +CDB +^¬CFBh;GGϘ(bCé/C)8BuqCeC9D)D5OCÌп~B.yCp0H +@GOGGdD )A{-C1iBdDmCzB7èS3h/v{BkCH?Cl9qCY4C7D D6e/DÄDR{DLD>FBYC( +BBD,`4BG@H>kC_D(DYDR#uDf +DTKDDODD~C7RCҰ.CqY(DC0ACjb/I*PI}"H:H(CB5JDiD2DF)DmrtDENCDA#=xBiD/D5oPCvBLZCƔC1C@+xCGJ9&B#"aC7ѥBZTD 5B'C*A*C1fB6WY~vH - - -For screen-shot slides, click [here](/course/02_FilePaths/slides.qmd) - ---- - -Welcome to the second week of [Cytometry in R](/Schedule.qmd)! This week we will learn about file.path, namely, how to communicate to our computer (and R) where various files are stored. - -:::{.callout-important} -Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/index.qmd) and [Workstation Setup](/course/00_WorkstationSetup/index.qmd) walk-throughs, since we will begin where they left off once the required software was successfully installed. Having read-through how to use [version control](/course/00_Git/index.qmd) using Git will additionally be useful. -::: - -# Background - -```{r} -#| include: FALSE -library(BiocStyle) -``` - -When flow cytometrist first start learning how to code, we tend to think big picture: "I want to take my files, normalize them, cluster them, analyze them, and finally plot them". When we first start writing code, we tend to plan what we will write in similarly broad strokes. - -Our computers by contrast "think" in small incremental steps: "First locate this folder, list the files present, select these specific ones, import them into R, load the normalization package, pass the first file in, etc.". These steps when combined algorithmically add up to form the bigger picture. - -The challenge when first starting to learn how to code is developing a coding mindset in which we think not in broad strokes, but about what the next step will be programmatically. - -
- ---- - -We will start working on our own "coding mindsets" by working with file paths, as they communicate to our computer where to find our experiment files, and tend to be one of the early points of conflict and frustration. In the process, we will also cover additional concepts of R programming generally, including how to create/name variables, and look up the class/type of a particular object. - -
- ---- - -## Set Up - -Before we begin, let's make sure you get the data needed for today transferred to your local computer, and then get the .fcs files copied over from there to your own working project folder. This is the process you will repeat each week throughout the course. - -### New Repository - -First off, login to your GitHub account. Once there, you will select the options to create a new repository (similar to what you did during [Using GitHub](/course/00_GitHub/index.qmd#github-repository)) - -![](images/0001_NewRepo.png) - -
- ---- - -For this week, let's set this new repository up as a private repository, and call it Week2. This will keep things consistent with the file.paths we will be showing in the examples. - -![](images/0002_PrivateRepo.png) - -
- ---- - -Once the new repository has been created, copy the URL. - -![](images/0003_Url.png) - -
- ---- - -Next, open up Positron, set the interpreter to use R, and then select the option to bring in a "New Folder from Git". - -![](images/0004_NewGit.png) - -
- ---- - -Paste in your new repository's url. Additionally, if you want to match file.paths shown in the examples, set your storage location to your local Documents folder (please note the start of the file.path will look differently depending on whether you are on Windows, MacOS, or Linux). - -![](images/0005_SaveDocuments.png) - -
- ---- - -Your new repository will then be imported from GitHub. Once this is done, create two subfolders (data and images) and a new .qmd file (naming it filepaths.qmd). - -![](images/0006_BasicInfrastructure.png) - -
- ---- - -### Sync - -With this done, return to GitHub and open your [forked version](/course/00_GitHub/index.qmd#forking-cytometryinr) of the CytometryInR course folder. If you haven't yet done so, click on [sync](/course/00_Homeworks/index.qmd#sync-your-fork) to bring in this week's code and datasets. - -![](images/0008_Sync.png) - -
- ---- - -Returning to Positron, you will need to switch Project Folders, switching from Week2 over to CytometryInR. - -![](images/0007_SwitchFolders.png) - -
- ---- - -### Pull - -Once CytometryInR project folder has opened, you will need to [pull](/course/00_Git/index.qmd#pull) in the new data from GitHub to your local computer. - -![](images/0007_PullCytometryInR.png) - -
- ---- - -### Copy Files to Week2 - -Once this is done, you will see within the course folder, containing this weeks folder (02_FilePaths). Within it there is a data folder with .fcs files. To avoid causing conflicts when bringing in next week's materials, you will want to manually copy over these .fcs files (via your File Explorer) to the data folder within your "Week2" Project Folder. - -![](images/0009_Copy.png) - -
- ---- - -### Commit and Push - -When you reopen your Week2 project folder in Positron, you should now be able to see the .fcs files within the data folder. Next, from the action bar on the far left, select the Source Control tab. Stage all the changes (as was done in [Using Git](/course/00_Git/)), and write a short commit message. - -![](images/0010_Commit.png) - -
- ---- - -With these files now being tracked by version control, push (ie. send) your changes to GitHub so that they are remotely backed up. - -![](images/0011_Push.png) - -
- ---- - -And with this setup complete, you are now ready to proceed. Remember, run code and write notes in your working project folder (Week2 or otherwise named) to avoid conflicts next week in the CytometryInR folder when you are trying to bring in the Week #3 code and datasets. - -
- ---- - -# Walk Through - -## Working Directory - -Now that we are back in our Week2 folder, let's start by seeing our current location similarly to how our computer perceives it. - -We will use `getwd()` function (ie. get working directory) to return the location of the folder we are currently inside of. For example, when `getwd()` is run within my Week2 project folder, I see the following location - -```{r} -#| eval: FALSE -getwd() -``` - -![](images/0000_ReplacementGetWD.png) - -This returns a file path. The final location (Week2 in this case) is the **Working Directory**. Your computer when working in R will be descern other locations in relation to this directory. - -
- ---- - -## Directories - -Within this working directory, we have a variety of project folders and files related to the course. We can see the folders that are present using the `list.dirs()` function. - -```{r} -#| eval: FALSE -list.dirs(path=".", full.names=FALSE, recursive=FALSE) -``` - -![](images/0000_ReplacementListFiles.png) - -Within this `list.dirs()` function, we are specifying two arguments with which we will be working with later today, *full.names* and *recursive*. For now, lets set their arguments to FALSE, which means they conditions they implement are inactive (turned off). - -
- ---- - -The path argument is currently set to ".", which is a stand-in for the present directory. In R, if an argument is not specified directly, it is inferred based on an order of expected arguments. Thus, if not present, we could still get the same output as seen before. - -```{r} -#| eval: FALSE -list.dirs(full.names=FALSE, recursive=FALSE) -``` - -![](images/0000_ReplacementListFiles.png) - -
- ---- - -Within Positron, in addition to visible folders, we also have *hidden folders* (denoted by the "." in front of the folder name when using `list.dirs()`). In the case of one of our course website folders, we can see a ".quarto" folder shown in a lighter gray . The ".git" folder we saw from `list.dirs()` is typically hidden when viewing from Positron. - -![](images/02_HiddenFolder.png) - -In the case of Week2, the two not-hidden folders we created are listed. We will see how to navigate these in a second. - -
- ---- - -![](images/0000_ReplacementView.png) - -
- ---- - -## Variables - -Before exploring file paths, we need to have some basic R code knowledge that we can use to work with them. Within R, we have the ability to assign particular values (be they character strings, numbers or logicals) to objects (ie. variables) that can be used when called upon later. - -For example: - -```{r} -#| eval: FALSE -WhatDayDidIWriteThis <- "Saturday" -``` - -In this case, the variable name is what the assignment arrow ("<-") is pointing at. In this case, WhatDayDidIWriteThis - -
- ---- - -When we run this, we create a variable, that will appear within the right-sidebar. - -```{r} -#| eval: TRUE -WhatDayDidIWriteThis <- "Saturday" -``` - -![](images/04_VariableList.png) - -
- ---- - -These variables can subsequently be retrieved by printing (ie. running) the name of the variable - -```{r} -WhatDayDidIWriteThis -``` - -
- ---- - -You can create variables with almost any name you can think of - -```{r} -TopSecretMeetingDay <- "Saturday" -``` - -
- ---- - -With a few exceptions. R doesn't play well with spaces: - -```{r} -#| error: TRUE -Top Secret Meeting Day <- "Saturday" -``` - -
- ---- - -But does play well with underscores: - -```{r} -Top_Secret_Meeting_Day <- "Saturday" -``` - -
- ---- - -The above (with individual words separated by _) is collectively known as snake case. The alternate way to help delineate variable names is "camelCase", with first letter of each word being capitalized (seen in the previous example). - -![](images/CamelCase.jpeg) - -
- ---- - -```{r} -TopSecretMeetingDay -``` - -
- ---- - -You can overwrite a Variable name by assigning a different value to it: - -```{r} -TopSecretMeetingDay <- "Monday" -``` - -```{r} -TopSecretMeetingDay -``` - -
- ---- - -You can also remove individual variables via the `rm` function - -```{r} -rm(Top_Secret_Meeting_Day) -``` - -
- ---- - -Or if trying to remove all, via the right sidebar - -![](images/10_RemoveVariables.png) - - -
- ---- - -In the prior case, we are creating a variable that is a "string" of character values, due to our use of "" around the word. We can see this when we use the `str()` function. - -```{r} -Fluorophores <- "FITC" -str(Fluorophores) -``` - -The "chr" in front denotating that Fluorophores contains a character string. - -
- ---- - -This could also be retrieved using the `class()` function. - -```{r} -class(Fluorophores) -``` - -
- ---- - -Alternatively, we could assign a numeric value to a variable - -```{r} -Fluorophores <- 29 -str(Fluorophores) -``` - -Which returns "num", ie. numeric. - -
- ---- - -We can also specify a logical (ie. True or FALSE) to a particular object - -```{r} -IsPerCPCy5AGoodFluorophore <- FALSE -str(IsPerCPCy5AGoodFluorophore) -``` - -Which returns logi in front, denoting this variable contains a logical value. - -
- ---- - -Last week, when we were installing `dplyr`, the reason that installation failed was `install.packages()` expects a character string. However, when we left off the "", it looked within our local environments created variables for the dplyr variable, couldn't find it, and thus failed. - -We could of course, have assigned a character value to a variable name, and then used that variable name, which would have worked. - -```{r} -#| eval: FALSE - -PackageToInstall <- "dplyr" - -install.packages(PackageToInstall) -``` - -
- ---- - -## Indexing - -Not all variables contain single objects. - -For example, we can modify Fluorophores and add additional entries: - -```{r} -Fluorophores <- c("BV421", "FITC", "PE", "APC") -str(Fluorophores) -``` - -The c stands for concatenate. It concatenates the objects into a larger object, known as a vector. - -In this case, you notice in addition to the specification the values are characters, we get a [1:4], denoting four objects are present. - -
- ---- - -We can similarly retrieve this information using the `length()` function - -```{r} -length(Fluorophores) -``` - -
- ---- - -When multiple objects are present, we can specify them individidually by providing their index number within square brackets []. - -```{r} -Fluorophores[1] -``` - -
- ---- - -```{r} -Fluorophores[3] -``` - -
- ---- - -Or specify in sequence using a colon (:) - -```{r} -Fluorophores[3:4] -``` - -
- ---- - -Or if not adjacent, reusing `c` within the square brackets - -```{r} -Fluorophores[c(1,4)] -``` - -
- ---- - -We will revisit these concepts throughout the course, with what we have covered today, this will help us create file.paths and select fcs files that we want to work with via index number. - -## Listing Files - -After this detour into variables and indexing, let's return our focus to how to use these in context of file paths. Working from within our Week2 project folder, let's see what directories (folders) are present - -```{r} -#| eval: FALSE -list.dirs(path=".", full.names=FALSE, recursive=FALSE) -``` - -![](images/00.png) - -
- ---- - -We can also list any files that are present within our working directory using the `list.files()` function. - -```{r} -#| eval: FALSE -list.files() -``` - -![](images/01.png) - -In this case, in addition to our filepaths.qmd file, we can see the LICENSE and README files created when we set up the repository. - -
- ---- - -We can also specify a particular folder we want to show items present within by changing the path argument. For example, if we wanted to see the contents of the "data" folder - -```{r} -#| eval: FALSE -list.files(path="data", full.names=FALSE, recursive=FALSE) -``` - -![](images/02.png) - -Which in this case returns the fcs files we copied over at the start of this lesson. - -
- ---- - -In this case, there are no folders under "data". Let's go ahead and create a new one, calling it target. - -![](images/03.png) - -
- ---- - -## Creating directories - -Alternatively, we can also create a folder via R using the `dir.create()` function. Since we want it within data, we would modify the path accordingly - -```{r} -#| eval: FALSE -NewFolderLocation <- file.path("data", "target2") - -dir.create(path=NewFolderLocation) -``` - -![](images/04.png) - -
- ---- - -Before continuing, let's copy the first two .fcs files into both target and target2. - -
- -![](images/06.png) - ---- - -Given our working directory is set the top-level of the Week2 project folder, we can't just check inside nested target folders directly. If we attempt to: - -```{r} -list.files(path="target", full.names=FALSE, recursive=FALSE) -``` - -
- ---- - -No files are returned (ie, character(0)), since from our computers perspective, "target" doesn't exist within the active working directory. - -```{r} -file.exists("target") -``` - -
- ---- - -On the other hand, within it's view, it knows that the data folder exist - -```{r} -#| eval: FALSE -file.exists("data") -``` - -![](images/05.png) - -So here we encounter the first challenge when communicating to our computer where to search for and find files. We need to provide a file.path that incorporates the path of folders between where the computer is currently at (ie. the working directory) and the target file itself. - -
- ---- - -## File Paths - -One way we can do this is through a file.path argument. We could potentially provide this by adding either a / or a \ into the path argument, depending on your computers operating system. - -```{r} -#| eval: FALSE -list.files(path="data/target", full.names=FALSE, recursive=FALSE) -``` - -![](images/07.png) - -
- -While this works in your particular context, if you are sharing the code with others who have a different operating system, these hard-coded "/" or "\" will cause the code for them to error out at these particular steps. - ---- - -For that reason, it is better to assemble a file.path using the `file.path()` function. This function takes into account the operating system, removing your need to have to worry about this particular computing nuance, and write code that is reproducible and replicable for everyone. - -```{r} -FolderLocation <- file.path("data", "target") -FolderLocation -``` - -```{r} -#| eval: FALSE -list.files(path=FolderLocation, full.names=FALSE, recursive=FALSE) -``` - -![](images/07.png) - -
- ---- - -We can also append additional locations to existing file paths, by including the variable name within the `file.path()` we are creating. - -```{r} -FolderLocation <- "data" -ScreenshotFolder <- file.path(FolderLocation, "target") -ScreenshotFolder -``` - -```{r} -#| eval: FALSE - -list.files(path=ScreenshotFolder, full.names=FALSE, recursive=FALSE) -``` - -![](images/07.png) - -
- ---- - -Additionally, `list.files()` has the ability to filter for files that contain a particular character string. This can be useful is we are searching for ".fcs" or ".csv" files, but also for files that contain a particular word. In the case of the ScreenshotFolders - -```{r} -#| eval: FALSE -list.files(path=ScreenshotFolder, pattern="ND050", full.names=FALSE, recursive=FALSE) -``` - -![](images/08.png) - -You will notice, the index numbers are in the context of what is filtered, not all the folder contents. - -
- ---- - -## Selecting for Patterns - -If we currently listed the files within data, we get a return that looks like this: - -```{r} -#| eval: FALSE -list.files("data", full.names=FALSE, recursive=FALSE) -``` - -![](images/09.png) - -
- ---- - -As you can see, we are getting back both folders and individual .fcs files. We could consequently change the pattern to provide a character string that will only return the .fcs files. We will go ahead and assign this list to a variable named files, for later retrieval. - -```{r} -#| eval: FALSE -files <- list.files("data", pattern=".fcs", full.names=FALSE, recursive=FALSE) -files -``` - -![](images/10.png) - -
- ---- - -One of the R packages we will be using througout the course is the `stringr` package. It contains two functions that can be useful when identifying more complicated character strings. In this case, if we run the `str_detect()` function to identify which of the .fcs files within the files variable contains the "INF" character string, we get a vector of logical (ie. True or FALSE) outputs corresponding to each file. - -```{r} -# install.packages("stringr") # CRAN -library(stringr) -``` - -```{r} -#| eval: FALSE -str_detect(files, "INF") -``` - -![](images/11.png) - -
- ---- - -Similar to how we indexed the Fluorophore list (ex. Fluorophore[1:2]) which returned a subset, we can similarly use this logical vector to subset files that returned as TRUE for containing the pattern "INF" - -```{r} -#| eval: FALSE -files[str_detect(files, "INF")] -``` - -![](images/12.png) - -
- ---- - -Let's go ahead and save these subsetted file names to a new variable, called Infants. - -```{r} -#| eval: FALSE -Infants <- files[str_detect(files, "INF")] -``` - -## Conditionals - -One useful thing is that within R, we can set conditions on whether something is carried out. The most typical conditional you will encounter are the "If" statements. They typically take a form that resembles the following. - -```{r} -#| eval: FALSE - -NeedCoffee <- TRUE - -if (NeedCoffee){ - print("Take a break") -} -``` - -
- ---- - -In this case of the above, if the variable within the () is equal to true, the code within the {} will be executed. - -```{r} - -NeedCoffee <- TRUE - -if (NeedCoffee){ - print("Take a break") -} -``` - -
- ---- - -By contrast, when the variable within the () is equal to false, the code within the {} will not be executed. - -```{r} -NeedCoffee <- FALSE - -if (NeedCoffee){ - print("Take a break") -} -``` - -
- ---- - -These "If" statements will trigger as long as the specified condition within the () is TRUE. For a different example: - -```{r} -RowNumber <- 299 -2 + RowNumber > 300 -``` - -```{r} -if (2 + RowNumber > 3){ - print("Stop Iterating") -} -``` - -
- ---- - -When you add an ! in front a conditional, it flips the expected outcome. - -```{r} -ItsRaining <- TRUE - -if (ItsRaining){print("Bring an Umbrella")} -``` - -```{r} -!ItsRaining -``` - -```{r} -if (!ItsRaining){print("Bring an Umbrella")} -``` - -```{r} -ItsRaining <- TRUE - -if (!ItsRaining){print("Bring Sunglasses")} - -``` - -
- ---- - -We will explore more complicated conditionals throughout the course, but for now, let's implement a couple simple ones in the context of copying over the .fcs files in Infants over to a new target3 folder. - -## Conditionals in practice - -First off, let's write a conditional to check if there is a target3 folder within data. - -```{r} -#| eval: FALSE -files_present <- list.files("data", full.names=FALSE, recursive=FALSE) -files_present -``` - -![](images/13.png) - -
- ---- - -```{r} -#| eval: FALSE - -FolderTarget3 <- file.path("data", "target3") -dir.exists(FolderTarget3) -``` - -![](images/14.png) - -
- ---- - -We can write a conditional to create a folder if one does not yet exist. - -```{r} -#| eval: FALSE -if (!dir.exists(FolderTarget3)){ - dir.create(FolderTarget3) -} -``` - -![](images/15.png) - -
- ---- - -## Copying Files - -To copy files to another folder location, we use the `file.copy()` function. It has two arguments that we will be working with, from being the .fcs files, and to being the folder location we wish to transfer them to. If we tried using them as we currently have them: - -```{r} -#| eval: FALSE - -# Variable Infants containing 4 .fcs file names - -file.copy(from=Infants, to=FolderTarget3) -``` - -![](images/16.png) - -
- ---- - -The reason for this error is we are only working with a partial file path, as viewed from our Working directory. In this case, what is needed is the full file.path, so the file.path should also include the upstream folders from your current working directory. - -```{r} -#| eval: FALSE -getwd() -``` - -![](images/17.png) - -
- ---- - - -In this case, we can update the .fcs files location by switching the full.names argument within `list.files()` from FALSE, to TRUE. - -```{r} -#| eval: FALSE -files_present <- list.files("data", full.names=TRUE, recursive=FALSE) -files_present -``` - -![](images/18.png) - -And filter for those containing "INF" again - -```{r} -#| eval: FALSE -Infants <- files_present[str_detect(files_present, "INF")] -``` - -And then try again: - -```{r} -#| eval: FALSE - -# Variable Infants containing 4 .fcs file names - -file.copy(from=Infants, to=FolderTarget3) -``` - -![](images/19.png) - -
- ---- - -## Removing files. - -Just like we can add files via R, we can also remove them. However, when we remove them via this route, they are removed permanently, not sent to the recycle bin. We will revisit how later on in the course after you have gained additional experience with file.paths. - -```{r} -#| eval: FALSE -?unlink() -``` - -## Basename - -If we look at Infants with the full.names=TRUE, we see the additional pathing folder has been added, allowing us to successfully copy over the files. - -```{r} -#| eval: FALSE -Infants -``` - -![](images/20.png) - -
- ---- - -If we were trying to retrieve just the local file names from the full.names, we could do so with `basename()` function. We will use this in combination with additional arguments later in the course - -```{r} -#| eval: FALSE - -basename(Infants) -``` - -![](images/22.png) - -## Recursive - -And finally that we have created additional nested folders and populated them with fcs files, let's see what setting `list.files()` recursive argument to TRUE - -```{r} -#| eval: FALSE -all_files_present <- list.files(full.names=TRUE, recursive=TRUE) -all_files_present -``` - -![](images/RecursiveTrue.png) - -
- ---- - -In this case, all files in all folders within the working directory are shown. This can be useful when exploring folder contents, but if there are a lot of files present within the folder, it will take a while to return the list. - -
- ---- - - -## Saving changes to Version Control - -And as is good practice, to maintain version control, let's stage all the files and folders we created today within the Week2 Project Folder, write a commit message, and send these files back to GitHub until they are needed again next time. - -![](images/23.png) - ---- - -# Wrap-Up - -In this session, we started to learn about working directories, file.paths and how to locate files of interest. We also learned how variables (objects) are created in R using the assignment arrow, how they are named, and the general structure (character, numeric, logical) that they are represented as. - -This will prove valuable in the next several weeks when working with .fcs files, as the majority of functions we will use for Bioconductor project R packages need file.paths to locate both .fcs files as well as .csv files that contain metadata. - -One of the most frequent errors that beginners encounter when trying to load in .fcs files into the `flowCore` package is not providing the full file.path to the .fcs file of interest. - -Next week, having installed the required R packages, and learned a little about variables and file.paths, we will dive into our first cytometry focused session. We will be cracking open an .fcs file and exploring how things are stored within. In the process of seeing how the file contents are organized, we will continue to learn and practice how to create variables, and general object structure types within R. Until then, have a wonderful week! - -![](images/Week2Exit.jpg) - -# Additional Resources - -[Riffomonas: Using paths in R and why you shouldn't be using setwd (CC179)](https://youtu.be/StqDYjM6ULo?si=ba2on5rNphQ9AL-B) - -[Project-oriented workflow](https://tidyverse.org/blog/2017/12/workflow-vs-script/) - -[Paths, working directories, and projects in R; Learn R Video 13](https://youtu.be/lJcuXBFP7Co?si=dqptQ3UGGjmTYqnB) - -[Demystifying File Paths in R: Navigate Nested Folders with Dr. Padilla](https://youtu.be/yeiT5Kj_uG8?si=UySsolzbTxbgGMF6) - -# Take-home Problems - -:::{.callout-tip title="Problem 1"} -Plug in an external hard-drive or USB into your computer. Manually, create a folder within called "TargetFolder". Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D -::: - -:::{.callout-tip title="Problem 2"} -In this session, we used `list.files()` with the "full.names argument" set to TRUE, as well as the `basename()` function to identify specific files. But what if you wanted a particular directory. Run `list.files()` with "full.names argument" and "recursive" argument set to TRUE, and then search online to find an R function that would retrieve the "" individual directory folders. -::: - -:::{.callout-tip title="Problem 3"} -R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the `system.file()` function. See an example below. - -```{r} -#| eval: FALSE -system.file("extdata", package = "FlowSOM") -``` - -Using what we have learned about file.path navigation, search your way down the file.directory of the `FlowSOM` and `flowWorkspace` packages, and identify any .fcs files that are present for use in the documentation. -::: - - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -::: +--- +title: "02 - File Paths" +author: "David Rach" +date: 02-09-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://www.youtube.com/live/fwSu97DYlaU?si=R3DpH9dRuUCexJMN) + + + + +For screen-shot slides, click [here](/course/02_FilePaths/slides.qmd) + +--- + +Welcome to the second week of [Cytometry in R](/Schedule.qmd)! This week we will learn about file.path, namely, how to communicate to our computer (and R) where various files are stored. + +:::{.callout-important} +Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/index.qmd) and [Workstation Setup](/course/00_WorkstationSetup/index.qmd) walk-throughs, since we will begin where they left off once the required software was successfully installed. Having read-through how to use [version control](/course/00_Git/index.qmd) using Git will additionally be useful. +::: + +# Background + +```{r} +#| include: FALSE +library(BiocStyle) +``` + +When flow cytometrist first start learning how to code, we tend to think big picture: "I want to take my files, normalize them, cluster them, analyze them, and finally plot them". When we first start writing code, we tend to plan what we will write in similarly broad strokes. + +Our computers by contrast "think" in small incremental steps: "First locate this folder, list the files present, select these specific ones, import them into R, load the normalization package, pass the first file in, etc.". These steps when combined algorithmically add up to form the bigger picture. + +The challenge when first starting to learn how to code is developing a coding mindset in which we think not in broad strokes, but about what the next step will be programmatically. + +
+ +--- + +We will start working on our own "coding mindsets" by working with file paths, as they communicate to our computer where to find our experiment files, and tend to be one of the early points of conflict and frustration. In the process, we will also cover additional concepts of R programming generally, including how to create/name variables, and look up the class/type of a particular object. + +
+ +--- + +## Set Up + +Before we begin, let's make sure you get the data needed for today transferred to your local computer, and then get the .fcs files copied over from there to your own working project folder. This is the process you will repeat each week throughout the course. + +### New Repository + +First off, login to your GitHub account. Once there, you will select the options to create a new repository (similar to what you did during [Using GitHub](/course/00_GitHub/index.qmd#github-repository)) + +![](images/0001_NewRepo.png) + +
+ +--- + +For this week, let's set this new repository up as a private repository, and call it Week2. This will keep things consistent with the file.paths we will be showing in the examples. + +![](images/0002_PrivateRepo.png) + +
+ +--- + +Once the new repository has been created, copy the URL. + +![](images/0003_Url.png) + +
+ +--- + +Next, open up Positron, set the interpreter to use R, and then select the option to bring in a "New Folder from Git". + +![](images/0004_NewGit.png) + +
+ +--- + +Paste in your new repository's url. Additionally, if you want to match file.paths shown in the examples, set your storage location to your local Documents folder (please note the start of the file.path will look differently depending on whether you are on Windows, MacOS, or Linux). + +![](images/0005_SaveDocuments.png) + +
+ +--- + +Your new repository will then be imported from GitHub. Once this is done, create two subfolders (data and images) and a new .qmd file (naming it filepaths.qmd). + +![](images/0006_BasicInfrastructure.png) + +
+ +--- + +### Sync + +With this done, return to GitHub and open your [forked version](/course/00_GitHub/index.qmd#forking-cytometryinr) of the CytometryInR course folder. If you haven't yet done so, click on [sync](/course/00_Homeworks/index.qmd#sync-your-fork) to bring in this week's code and datasets. + +![](images/0008_Sync.png) + +
+ +--- + +Returning to Positron, you will need to switch Project Folders, switching from Week2 over to CytometryInR. + +![](images/0007_SwitchFolders.png) + +
+ +--- + +### Pull + +Once CytometryInR project folder has opened, you will need to [pull](/course/00_Git/index.qmd#pull) in the new data from GitHub to your local computer. + +![](images/0007_PullCytometryInR.png) + +
+ +--- + +### Copy Files to Week2 + +Once this is done, you will see within the course folder, containing this weeks folder (02_FilePaths). Within it there is a data folder with .fcs files. To avoid causing conflicts when bringing in next week's materials, you will want to manually copy over these .fcs files (via your File Explorer) to the data folder within your "Week2" Project Folder. + +![](images/0009_Copy.png) + +
+ +--- + +### Commit and Push + +When you reopen your Week2 project folder in Positron, you should now be able to see the .fcs files within the data folder. Next, from the action bar on the far left, select the Source Control tab. Stage all the changes (as was done in [Using Git](/course/00_Git/)), and write a short commit message. + +![](images/0010_Commit.png) + +
+ +--- + +With these files now being tracked by version control, push (ie. send) your changes to GitHub so that they are remotely backed up. + +![](images/0011_Push.png) + +
+ +--- + +And with this setup complete, you are now ready to proceed. Remember, run code and write notes in your working project folder (Week2 or otherwise named) to avoid conflicts next week in the CytometryInR folder when you are trying to bring in the Week #3 code and datasets. + +
+ +--- + +# Walk Through + +## Working Directory + +Now that we are back in our Week2 folder, let's start by seeing our current location similarly to how our computer perceives it. + +We will use `getwd()` function (ie. get working directory) to return the location of the folder we are currently inside of. For example, when `getwd()` is run within my Week2 project folder, I see the following location + +```{r} +#| eval: FALSE +getwd() +``` + +![](images/0000_ReplacementGetWD.png) + +This returns a file path. The final location (Week2 in this case) is the **Working Directory**. Your computer when working in R will be descern other locations in relation to this directory. + +
+ +--- + +## Directories + +Within this working directory, we have a variety of project folders and files related to the course. We can see the folders that are present using the `list.dirs()` function. + +```{r} +#| eval: FALSE +list.dirs(path=".", full.names=FALSE, recursive=FALSE) +``` + +![](images/0000_ReplacementListFiles.png) + +Within this `list.dirs()` function, we are specifying two arguments with which we will be working with later today, *full.names* and *recursive*. For now, lets set their arguments to FALSE, which means they conditions they implement are inactive (turned off). + +
+ +--- + +The path argument is currently set to ".", which is a stand-in for the present directory. In R, if an argument is not specified directly, it is inferred based on an order of expected arguments. Thus, if not present, we could still get the same output as seen before. + +```{r} +#| eval: FALSE +list.dirs(full.names=FALSE, recursive=FALSE) +``` + +![](images/0000_ReplacementListFiles.png) + +
+ +--- + +Within Positron, in addition to visible folders, we also have *hidden folders* (denoted by the "." in front of the folder name when using `list.dirs()`). In the case of one of our course website folders, we can see a ".quarto" folder shown in a lighter gray . The ".git" folder we saw from `list.dirs()` is typically hidden when viewing from Positron. + +![](images/02_HiddenFolder.png) + +In the case of Week2, the two not-hidden folders we created are listed. We will see how to navigate these in a second. + +
+ +--- + +![](images/0000_ReplacementView.png) + +
+ +--- + +## Variables + +Before exploring file paths, we need to have some basic R code knowledge that we can use to work with them. Within R, we have the ability to assign particular values (be they character strings, numbers or logicals) to objects (ie. variables) that can be used when called upon later. + +For example: + +```{r} +#| eval: FALSE +WhatDayDidIWriteThis <- "Saturday" +``` + +In this case, the variable name is what the assignment arrow ("<-") is pointing at. In this case, WhatDayDidIWriteThis + +
+ +--- + +When we run this, we create a variable, that will appear within the right-sidebar. + +```{r} +#| eval: TRUE +WhatDayDidIWriteThis <- "Saturday" +``` + +![](images/04_VariableList.png) + +
+ +--- + +These variables can subsequently be retrieved by printing (ie. running) the name of the variable + +```{r} +WhatDayDidIWriteThis +``` + +
+ +--- + +You can create variables with almost any name you can think of + +```{r} +TopSecretMeetingDay <- "Saturday" +``` + +
+ +--- + +With a few exceptions. R doesn't play well with spaces: + +```{r} +#| error: TRUE +Top Secret Meeting Day <- "Saturday" +``` + +
+ +--- + +But does play well with underscores: + +```{r} +Top_Secret_Meeting_Day <- "Saturday" +``` + +
+ +--- + +The above (with individual words separated by _) is collectively known as snake case. The alternate way to help delineate variable names is "camelCase", with first letter of each word being capitalized (seen in the previous example). + +![](images/CamelCase.jpeg) + +
+ +--- + +```{r} +TopSecretMeetingDay +``` + +
+ +--- + +You can overwrite a Variable name by assigning a different value to it: + +```{r} +TopSecretMeetingDay <- "Monday" +``` + +```{r} +TopSecretMeetingDay +``` + +
+ +--- + +You can also remove individual variables via the `rm` function + +```{r} +rm(Top_Secret_Meeting_Day) +``` + +
+ +--- + +Or if trying to remove all, via the right sidebar + +![](images/10_RemoveVariables.png) + + +
+ +--- + +In the prior case, we are creating a variable that is a "string" of character values, due to our use of "" around the word. We can see this when we use the `str()` function. + +```{r} +Fluorophores <- "FITC" +str(Fluorophores) +``` + +The "chr" in front denotating that Fluorophores contains a character string. + +
+ +--- + +This could also be retrieved using the `class()` function. + +```{r} +class(Fluorophores) +``` + +
+ +--- + +Alternatively, we could assign a numeric value to a variable + +```{r} +Fluorophores <- 29 +str(Fluorophores) +``` + +Which returns "num", ie. numeric. + +
+ +--- + +We can also specify a logical (ie. True or FALSE) to a particular object + +```{r} +IsPerCPCy5AGoodFluorophore <- FALSE +str(IsPerCPCy5AGoodFluorophore) +``` + +Which returns logi in front, denoting this variable contains a logical value. + +
+ +--- + +Last week, when we were installing `dplyr`, the reason that installation failed was `install.packages()` expects a character string. However, when we left off the "", it looked within our local environments created variables for the dplyr variable, couldn't find it, and thus failed. + +We could of course, have assigned a character value to a variable name, and then used that variable name, which would have worked. + +```{r} +#| eval: FALSE + +PackageToInstall <- "dplyr" + +install.packages(PackageToInstall) +``` + +
+ +--- + +## Indexing + +Not all variables contain single objects. + +For example, we can modify Fluorophores and add additional entries: + +```{r} +Fluorophores <- c("BV421", "FITC", "PE", "APC") +str(Fluorophores) +``` + +The c stands for concatenate. It concatenates the objects into a larger object, known as a vector. + +In this case, you notice in addition to the specification the values are characters, we get a [1:4], denoting four objects are present. + +
+ +--- + +We can similarly retrieve this information using the `length()` function + +```{r} +length(Fluorophores) +``` + +
+ +--- + +When multiple objects are present, we can specify them individidually by providing their index number within square brackets []. + +```{r} +Fluorophores[1] +``` + +
+ +--- + +```{r} +Fluorophores[3] +``` + +
+ +--- + +Or specify in sequence using a colon (:) + +```{r} +Fluorophores[3:4] +``` + +
+ +--- + +Or if not adjacent, reusing `c` within the square brackets + +```{r} +Fluorophores[c(1,4)] +``` + +
+ +--- + +We will revisit these concepts throughout the course, with what we have covered today, this will help us create file.paths and select fcs files that we want to work with via index number. + +## Listing Files + +After this detour into variables and indexing, let's return our focus to how to use these in context of file paths. Working from within our Week2 project folder, let's see what directories (folders) are present + +```{r} +#| eval: FALSE +list.dirs(path=".", full.names=FALSE, recursive=FALSE) +``` + +![](images/00.png) + +
+ +--- + +We can also list any files that are present within our working directory using the `list.files()` function. + +```{r} +#| eval: FALSE +list.files() +``` + +![](images/01.png) + +In this case, in addition to our filepaths.qmd file, we can see the LICENSE and README files created when we set up the repository. + +
+ +--- + +We can also specify a particular folder we want to show items present within by changing the path argument. For example, if we wanted to see the contents of the "data" folder + +```{r} +#| eval: FALSE +list.files(path="data", full.names=FALSE, recursive=FALSE) +``` + +![](images/02.png) + +Which in this case returns the fcs files we copied over at the start of this lesson. + +
+ +--- + +In this case, there are no folders under "data". Let's go ahead and create a new one, calling it target. + +![](images/03.png) + +
+ +--- + +## Creating directories + +Alternatively, we can also create a folder via R using the `dir.create()` function. Since we want it within data, we would modify the path accordingly + +```{r} +#| eval: FALSE +NewFolderLocation <- file.path("data", "target2") + +dir.create(path=NewFolderLocation) +``` + +![](images/04.png) + +
+ +--- + +Before continuing, let's copy the first two .fcs files into both target and target2. + +
+ +![](images/06.png) + +--- + +Given our working directory is set the top-level of the Week2 project folder, we can't just check inside nested target folders directly. If we attempt to: + +```{r} +list.files(path="target", full.names=FALSE, recursive=FALSE) +``` + +
+ +--- + +No files are returned (ie, character(0)), since from our computers perspective, "target" doesn't exist within the active working directory. + +```{r} +file.exists("target") +``` + +
+ +--- + +On the other hand, within it's view, it knows that the data folder exist + +```{r} +#| eval: FALSE +file.exists("data") +``` + +![](images/05.png) + +So here we encounter the first challenge when communicating to our computer where to search for and find files. We need to provide a file.path that incorporates the path of folders between where the computer is currently at (ie. the working directory) and the target file itself. + +
+ +--- + +## File Paths + +One way we can do this is through a file.path argument. We could potentially provide this by adding either a / or a \ into the path argument, depending on your computers operating system. + +```{r} +#| eval: FALSE +list.files(path="data/target", full.names=FALSE, recursive=FALSE) +``` + +![](images/07.png) + +
+ +While this works in your particular context, if you are sharing the code with others who have a different operating system, these hard-coded "/" or "\" will cause the code for them to error out at these particular steps. + +--- + +For that reason, it is better to assemble a file.path using the `file.path()` function. This function takes into account the operating system, removing your need to have to worry about this particular computing nuance, and write code that is reproducible and replicable for everyone. + +```{r} +FolderLocation <- file.path("data", "target") +FolderLocation +``` + +```{r} +#| eval: FALSE +list.files(path=FolderLocation, full.names=FALSE, recursive=FALSE) +``` + +![](images/07.png) + +
+ +--- + +We can also append additional locations to existing file paths, by including the variable name within the `file.path()` we are creating. + +```{r} +FolderLocation <- "data" +ScreenshotFolder <- file.path(FolderLocation, "target") +ScreenshotFolder +``` + +```{r} +#| eval: FALSE + +list.files(path=ScreenshotFolder, full.names=FALSE, recursive=FALSE) +``` + +![](images/07.png) + +
+ +--- + +Additionally, `list.files()` has the ability to filter for files that contain a particular character string. This can be useful is we are searching for ".fcs" or ".csv" files, but also for files that contain a particular word. In the case of the ScreenshotFolders + +```{r} +#| eval: FALSE +list.files(path=ScreenshotFolder, pattern="ND050", full.names=FALSE, recursive=FALSE) +``` + +![](images/08.png) + +You will notice, the index numbers are in the context of what is filtered, not all the folder contents. + +
+ +--- + +## Selecting for Patterns + +If we currently listed the files within data, we get a return that looks like this: + +```{r} +#| eval: FALSE +list.files("data", full.names=FALSE, recursive=FALSE) +``` + +![](images/09.png) + +
+ +--- + +As you can see, we are getting back both folders and individual .fcs files. We could consequently change the pattern to provide a character string that will only return the .fcs files. We will go ahead and assign this list to a variable named files, for later retrieval. + +```{r} +#| eval: FALSE +files <- list.files("data", pattern=".fcs", full.names=FALSE, recursive=FALSE) +files +``` + +![](images/10.png) + +
+ +--- + +One of the R packages we will be using througout the course is the `stringr` package. It contains two functions that can be useful when identifying more complicated character strings. In this case, if we run the `str_detect()` function to identify which of the .fcs files within the files variable contains the "INF" character string, we get a vector of logical (ie. True or FALSE) outputs corresponding to each file. + +```{r} +# install.packages("stringr") # CRAN +library(stringr) +``` + +```{r} +#| eval: FALSE +str_detect(files, "INF") +``` + +![](images/11.png) + +
+ +--- + +Similar to how we indexed the Fluorophore list (ex. Fluorophore[1:2]) which returned a subset, we can similarly use this logical vector to subset files that returned as TRUE for containing the pattern "INF" + +```{r} +#| eval: FALSE +files[str_detect(files, "INF")] +``` + +![](images/12.png) + +
+ +--- + +Let's go ahead and save these subsetted file names to a new variable, called Infants. + +```{r} +#| eval: FALSE +Infants <- files[str_detect(files, "INF")] +``` + +## Conditionals + +One useful thing is that within R, we can set conditions on whether something is carried out. The most typical conditional you will encounter are the "If" statements. They typically take a form that resembles the following. + +```{r} +#| eval: FALSE + +NeedCoffee <- TRUE + +if (NeedCoffee){ + print("Take a break") +} +``` + +
+ +--- + +In this case of the above, if the variable within the () is equal to true, the code within the {} will be executed. + +```{r} + +NeedCoffee <- TRUE + +if (NeedCoffee){ + print("Take a break") +} +``` + +
+ +--- + +By contrast, when the variable within the () is equal to false, the code within the {} will not be executed. + +```{r} +NeedCoffee <- FALSE + +if (NeedCoffee){ + print("Take a break") +} +``` + +
+ +--- + +These "If" statements will trigger as long as the specified condition within the () is TRUE. For a different example: + +```{r} +RowNumber <- 299 +2 + RowNumber > 300 +``` + +```{r} +if (2 + RowNumber > 3){ + print("Stop Iterating") +} +``` + +
+ +--- + +When you add an ! in front a conditional, it flips the expected outcome. + +```{r} +ItsRaining <- TRUE + +if (ItsRaining){print("Bring an Umbrella")} +``` + +```{r} +!ItsRaining +``` + +```{r} +if (!ItsRaining){print("Bring an Umbrella")} +``` + +```{r} +ItsRaining <- TRUE + +if (!ItsRaining){print("Bring Sunglasses")} + +``` + +
+ +--- + +We will explore more complicated conditionals throughout the course, but for now, let's implement a couple simple ones in the context of copying over the .fcs files in Infants over to a new target3 folder. + +## Conditionals in practice + +First off, let's write a conditional to check if there is a target3 folder within data. + +```{r} +#| eval: FALSE +files_present <- list.files("data", full.names=FALSE, recursive=FALSE) +files_present +``` + +![](images/13.png) + +
+ +--- + +```{r} +#| eval: FALSE + +FolderTarget3 <- file.path("data", "target3") +dir.exists(FolderTarget3) +``` + +![](images/14.png) + +
+ +--- + +We can write a conditional to create a folder if one does not yet exist. + +```{r} +#| eval: FALSE +if (!dir.exists(FolderTarget3)){ + dir.create(FolderTarget3) +} +``` + +![](images/15.png) + +
+ +--- + +## Copying Files + +To copy files to another folder location, we use the `file.copy()` function. It has two arguments that we will be working with, from being the .fcs files, and to being the folder location we wish to transfer them to. If we tried using them as we currently have them: + +```{r} +#| eval: FALSE + +# Variable Infants containing 4 .fcs file names + +file.copy(from=Infants, to=FolderTarget3) +``` + +![](images/16.png) + +
+ +--- + +The reason for this error is we are only working with a partial file path, as viewed from our Working directory. In this case, what is needed is the full file.path, so the file.path should also include the upstream folders from your current working directory. + +```{r} +#| eval: FALSE +getwd() +``` + +![](images/17.png) + +
+ +--- + + +In this case, we can update the .fcs files location by switching the full.names argument within `list.files()` from FALSE, to TRUE. + +```{r} +#| eval: FALSE +files_present <- list.files("data", full.names=TRUE, recursive=FALSE) +files_present +``` + +![](images/18.png) + +And filter for those containing "INF" again + +```{r} +#| eval: FALSE +Infants <- files_present[str_detect(files_present, "INF")] +``` + +And then try again: + +```{r} +#| eval: FALSE + +# Variable Infants containing 4 .fcs file names + +file.copy(from=Infants, to=FolderTarget3) +``` + +![](images/19.png) + +
+ +--- + +## Removing files. + +Just like we can add files via R, we can also remove them. However, when we remove them via this route, they are removed permanently, not sent to the recycle bin. We will revisit how later on in the course after you have gained additional experience with file.paths. + +```{r} +#| eval: FALSE +?unlink() +``` + +## Basename + +If we look at Infants with the full.names=TRUE, we see the additional pathing folder has been added, allowing us to successfully copy over the files. + +```{r} +#| eval: FALSE +Infants +``` + +![](images/20.png) + +
+ +--- + +If we were trying to retrieve just the local file names from the full.names, we could do so with `basename()` function. We will use this in combination with additional arguments later in the course + +```{r} +#| eval: FALSE + +basename(Infants) +``` + +![](images/22.png) + +## Recursive + +And finally that we have created additional nested folders and populated them with fcs files, let's see what setting `list.files()` recursive argument to TRUE + +```{r} +#| eval: FALSE +all_files_present <- list.files(full.names=TRUE, recursive=TRUE) +all_files_present +``` + +![](images/RecursiveTrue.png) + +
+ +--- + +In this case, all files in all folders within the working directory are shown. This can be useful when exploring folder contents, but if there are a lot of files present within the folder, it will take a while to return the list. + +
+ +--- + + +## Saving changes to Version Control + +And as is good practice, to maintain version control, let's stage all the files and folders we created today within the Week2 Project Folder, write a commit message, and send these files back to GitHub until they are needed again next time. + +![](images/23.png) + +--- + +# Wrap-Up + +In this session, we started to learn about working directories, file.paths and how to locate files of interest. We also learned how variables (objects) are created in R using the assignment arrow, how they are named, and the general structure (character, numeric, logical) that they are represented as. + +This will prove valuable in the next several weeks when working with .fcs files, as the majority of functions we will use for Bioconductor project R packages need file.paths to locate both .fcs files as well as .csv files that contain metadata. + +One of the most frequent errors that beginners encounter when trying to load in .fcs files into the `flowCore` package is not providing the full file.path to the .fcs file of interest. + +Next week, having installed the required R packages, and learned a little about variables and file.paths, we will dive into our first cytometry focused session. We will be cracking open an .fcs file and exploring how things are stored within. In the process of seeing how the file contents are organized, we will continue to learn and practice how to create variables, and general object structure types within R. Until then, have a wonderful week! + +![](images/Week2Exit.jpg) + +# Additional Resources + +[Riffomonas: Using paths in R and why you shouldn't be using setwd (CC179)](https://youtu.be/StqDYjM6ULo?si=ba2on5rNphQ9AL-B) + +[Project-oriented workflow](https://tidyverse.org/blog/2017/12/workflow-vs-script/) + +[Paths, working directories, and projects in R; Learn R Video 13](https://youtu.be/lJcuXBFP7Co?si=dqptQ3UGGjmTYqnB) + +[Demystifying File Paths in R: Navigate Nested Folders with Dr. Padilla](https://youtu.be/yeiT5Kj_uG8?si=UySsolzbTxbgGMF6) + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Plug in an external hard-drive or USB into your computer. Manually, create a folder within called "TargetFolder". Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D +::: + +:::{.callout-tip title="Problem 2"} +In this session, we used `list.files()` with the "full.names argument" set to TRUE, as well as the `basename()` function to identify specific files. But what if you wanted a particular directory. Run `list.files()` with "full.names argument" and "recursive" argument set to TRUE, and then search online to find an R function that would retrieve the "" individual directory folders. +::: + +:::{.callout-tip title="Problem 3"} +R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the `system.file()` function. See an example below. + +```{r} +#| eval: FALSE +system.file("extdata", package = "FlowSOM") +``` + +Using what we have learned about file.path navigation, search your way down the file.directory of the `FlowSOM` and `flowWorkspace` packages, and identify any .fcs files that are present for use in the documentation. +::: + + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: diff --git a/course/02_FilePaths/slides.qmd b/course/02_FilePaths/slides.qmd index eb30bfc..76ee3b0 100644 --- a/course/02_FilePaths/slides.qmd +++ b/course/02_FilePaths/slides.qmd @@ -1,1723 +1,1723 @@ ---- -title: "02 - File Paths" -author: "David Rach" -date: 02-16-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Welcome to the second week of [Cytometry in R](/Schedule.qmd)! This week we will learn about file.path, namely, how to communicate to our computer (and R) where various files are stored. -::: -::: - -::: {.fragment} -:::{.callout-important} -Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/index.qmd) and [Workstation Setup](/course/00_WorkstationSetup/index.qmd) walk-throughs, since we will begin where they left off once the required software was successfully installed. Having read-through how to use [version control](/course/00_Git/index.qmd) using Git will additionally be useful. -::: -::: - ---- - -# Background - -```{r} -#| include: FALSE -library(BiocStyle) -``` - - -::: {.fragment} -::: {.callout-tip title="."} -When flow cytometrist first start learning how to code, we tend to think big picture: "I want to take my files, normalize them, cluster them, analyze them, and finally plot them". When we first start writing code, we tend to plan what we will write in similarly broad strokes. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Our computers by contrast "think" in small incremental steps: "First locate this folder, list the files present, select these specific ones, import them into R, load the normalization package, pass the first file in, etc.". These steps when combined algorithmically add up to form the bigger picture. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The challenge when first starting to learn how to code is developing a coding mindset in which we think not in broad strokes, but about what the next step will be programmatically. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will start working on our own "coding mindsets" by working with file paths, as they communicate to our computer where to find our experiment files, and tend to be one of the early points of conflict and frustration. In the process, we will also cover additional concepts of R programming generally, including how to create/name variables, and look up the class/type of a particular object. -::: -::: - ---- - -## Set Up - - -::: {.fragment} -::: {.callout-tip title="."} -Before we begin, let's make sure you get the data needed for today transferred to your local computer, and then get the .fcs files copied over from there to your own working project folder. This is the process you will repeat each week throughout the course. -::: -::: - ---- - -### New Repository - -::: {.fragment} -::: {.callout-tip title="."} -First off, login to your GitHub account. Once there, you will select the options to create a new repository (similar to what you did during [Using GitHub](/course/00_GitHub/index.qmd#github-repository)) -::: -::: - ---- - -![](images/0001_NewRepo.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For this week, let's set this new repository up as a private repository, and call it Week2. This will keep things consistent with the file.paths we will be showing in the examples. -::: -::: - ---- - -![](images/0002_PrivateRepo.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Once the new repository has been created, copy the URL. -::: -::: - ---- - -![](images/0003_Url.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next, open up Positron, set the interpreter to use R, and then select the option to bring in a "New Folder from Git". -::: -::: - ---- - -![](images/0004_NewGit.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Paste in your new repository's url. Additionally, if you want to match file.paths shown in the examples, set your storage location to your local Documents folder (please note the start of the file.path will look differently depending on whether you are on Windows, MacOS, or Linux). -::: -::: - ---- - -![](images/0005_SaveDocuments.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Your new repository will then be imported from GitHub. Once this is done, create two subfolders (data and images) and a new .qmd file (naming it filepaths.qmd). -::: -::: - ---- - -![](images/0006_BasicInfrastructure.png) - ---- - -### Sync - -::: {.fragment} -::: {.callout-tip title="."} -With this done, return to GitHub and open your [forked version](/course/00_GitHub/index.qmd#forking-cytometryinr) of the CytometryInR course folder. If you haven't yet done so, click on [sync](/course/00_Homeworks/index.qmd#sync-your-fork) to bring in this week's code and datasets. -::: -::: - ---- - -![](images/0008_Sync.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Returning to Positron, you will need to switch Project Folders, switching from Week2 over to CytometryInR. -::: -::: - ---- - -![](images/0007_SwitchFolders.png) - ---- - -### Pull - -::: {.fragment} -::: {.callout-tip title="."} -Once CytometryInR project folder has opened, you will need to [pull](/course/00_Git/index.qmd#pull) in the new data from GitHub to your local computer. -::: -::: - ---- - -![](images/0007_PullCytometryInR.png) - ---- - -### Copy Files to Week2 - -::: {.fragment} -::: {.callout-tip title="."} -Once this is done, you will see within the course folder, containing this weeks folder (02_FilePaths). Within it there is a data folder with .fcs files. To avoid causing conflicts when bringing in next week's materials, you will want to manually copy over these .fcs files (via your File Explorer) to the data folder within your "Week2" Project Folder. -::: -::: - ---- - -![](images/0009_Copy.png) - ---- - -### Commit and Push - - -::: {.fragment} -::: {.callout-tip title="."} -When you reopen your Week2 project folder in Positron, you should now be able to see the .fcs files within the data folder. Next, from the action bar on the far left, select the Source Control tab. Stage all the changes (as was done in [Using Git](/course/00_Git/)), and write a short commit message. -::: -::: - ---- - -![](images/0010_Commit.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With these files now being tracked by version control, push (ie. send) your changes to GitHub so that they are remotely backed up. -::: -::: - ---- - -![](images/0011_Push.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And with this setup complete, you are now ready to proceed. Remember, run code and write notes in your working project folder (Week2 or otherwise named) to avoid conflicts next week in the CytometryInR folder when you are trying to bring in the Week #3 code and datasets. -::: -::: - ---- - -# Walk Through - -## Working Directory - -::: {.fragment} -::: {.callout-tip title="."} -Now that we are back in our Week2 folder, let's start by seeing our current location similarly to how our computer perceives it. - -We will use `getwd()` function (ie. get working directory) to return the location of the folder we are currently inside of. For example, when `getwd()` is run within my Week2 project folder, I see the following location -::: -::: - ---- - -```{r} -#| eval: FALSE -getwd() -``` - -![](images/0000_ReplacementGetWD.png) - -::: {.fragment} -::: {.callout-tip title="."} - -This returns a file path. The final location (Week2 in this case) is the **Working Directory**. Your computer when working in R will be descern other locations in relation to this directory. - -::: -::: - ---- - -## Directories - -::: {.fragment} -::: {.callout-tip title="."} -Within this working directory, we have a variety of project folders and files related to the course. We can see the folders that are present using the `list.dirs()` function. -::: -::: - -::: {.fragment} -![](images/0000_ReplacementView.png) -::: - -::: fragment -```{r} -#| eval: FALSE -list.dirs(path=".", full.names=FALSE, recursive=FALSE) -``` - -![](images/0000_ReplacementListFiles.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Within this `list.dirs()` function, we are specifying two arguments with which we will be working with later today, *full.names* and *recursive*. For now, lets set their arguments to FALSE, which means they conditions they implement are inactive (turned off). -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The path argument is currently set to ".", which is a stand-in for the present directory. In R, if an argument is not specified directly, it is inferred based on an order of expected arguments. Thus, if not present, we could still get the same output as seen before. -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE -list.dirs(full.names=FALSE, recursive=FALSE) -``` - -![](images/0000_ReplacementListFiles.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Within Positron, in addition to visible folders, we also have *hidden folders* (denoted by the "." in front of the folder name when using `list.dirs()`). In the case of one of our course website folders, we can see a ".quarto" folder shown in a lighter gray . The ".git" folder we saw from `list.dirs()` is typically hidden when viewing from Positron. -::: -::: - -::: {.fragment} - -![](images/02_HiddenFolder.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In the case of Week2, the two not-hidden folders we created are listed. We will see how to navigate these in a second. -::: -::: - -::: {.fragment} - -![](images/0000_ReplacementView.png) - -::: - ---- - -## Variables - -::: {.fragment} -::: {.callout-tip title="."} -Before exploring file paths, we need to have some basic R code knowledge that we can use to work with them. Within R, we have the ability to assign particular values (be they character strings, numbers or logicals) to objects (ie. variables) that can be used when called upon later. - -For example: - -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -WhatDayDidIWriteThis <- "Saturday" -``` -::: - -::: {.fragment} -::: {.callout-tip title="."} -In this case, the variable name is what the assignment arrow ("<-") is pointing at. In this case, WhatDayDidIWriteThis -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When we run this, we create a variable, that will appear within the right-sidebar. -::: -::: - -::: {.fragment} - -```{r} -#| eval: TRUE -WhatDayDidIWriteThis <- "Saturday" -``` - -::: - ---- - -![](images/04_VariableList.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -These variables can subsequently be retrieved by printing (ie. running) the name of the variable -::: -::: - -::: {.fragment} - -```{r} -WhatDayDidIWriteThis -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You can create variables with almost any name you can think of -::: -::: - -::: {.fragment} - -```{r} -TopSecretMeetingDay <- "Saturday" -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -With a few exceptions. R doesn't play well with spaces: -::: -::: - -::: {.fragment} - -```{r} -#| error: TRUE -Top Secret Meeting Day <- "Saturday" -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -But does play well with underscores: -::: -::: - -::: {.fragment} - -```{r} -Top_Secret_Meeting_Day <- "Saturday" -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The above (with individual words separated by _) is collectively known as snake case. The alternate way to help delineate variable names is "camelCase", with first letter of each word being capitalized (seen in the previous example). -::: -::: - ---- - -![](images/CamelCase.jpeg) - ---- - -```{r} -TopSecretMeetingDay -``` - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You can overwrite a Variable name by assigning a different value to it: -::: -::: - -::: {.fragment} - -```{r} -TopSecretMeetingDay <- "Monday" -``` - -::: - -::: {.fragment} - -```{r} -TopSecretMeetingDay -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You can also remove individual variables via the `rm` function -::: -::: - -::: {.fragment} - -```{r} -rm(Top_Secret_Meeting_Day) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Or if trying to remove all, via the right sidebar -::: -::: - ---- - -![](images/10_RemoveVariables.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In the prior case, we are creating a variable that is a "string" of character values, due to our use of "" around the word. We can see this when we use the `str()` function. -::: -::: - -::: {.fragment} - -```{r} -Fluorophores <- "FITC" -str(Fluorophores) -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} -The "chr" in front denotating that Fluorophores contains a character string. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This could also be retrieved using the `class()` function. -::: -::: - -::: {.fragment} - -```{r} -class(Fluorophores) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, we could assign a numeric value to a variable -::: -::: - -::: {.fragment} - -```{r} -Fluorophores <- 29 -str(Fluorophores) -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} -Which returns "num", ie. numeric. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can also specify a logical (ie. True or FALSE) to a particular object -::: -::: - -::: {.fragment} - -```{r} -IsPerCPCy5AGoodFluorophore <- FALSE -str(IsPerCPCy5AGoodFluorophore) -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} -Which returns logi in front, denoting this variable contains a logical value. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Last week, when we were installing `dplyr`, the reason that installation failed was `install.packages()` expects a character string. However, when we left off the "", it looked within our local environments created variables for the dplyr variable, couldn't find it, and thus failed. - -We could of course, have assigned a character value to a variable name, and then used that variable name, which would have worked. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -PackageToInstall <- "dplyr" - -install.packages(PackageToInstall) -``` - -::: - ---- - -## Indexing - -::: {.fragment} -::: {.callout-tip title="."} -Not all variables contain single objects. - -For example, we can modify Fluorophores and add additional entries: -::: -::: - -::: {.fragment} - -```{r} -Fluorophores <- c("BV421", "FITC", "PE", "APC") -str(Fluorophores) -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} -The c stands for concatenate. It concatenates the objects into a larger object, known as a vector. - -In this case, you notice in addition to the specification the values are characters, we get a [1:4], denoting four objects are present. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can similarly retrieve this information using the `length()` function -::: -::: - -::: {.fragment} - -```{r} -length(Fluorophores) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When multiple objects are present, we can specify them individidually by providing their index number within square brackets []. -::: -::: - - -::: {.fragment} - -```{r} -Fluorophores[1] -``` - -::: - ---- - -::: {.fragment} - -```{r} -Fluorophores[3] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Or specify in sequence using a colon (:) -::: -::: - -::: {.fragment} - -```{r} -Fluorophores[3:4] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Or if not adjacent, reusing `c` within the square brackets -::: -::: - -::: {.fragment} - -```{r} -Fluorophores[c(1,4)] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will revisit these concepts throughout the course, with what we have covered today, this will help us create file.paths and select fcs files that we want to work with via index number. -::: -::: - -## Listing Files - -::: {.fragment} -::: {.callout-tip title="."} -After this detour into variables and indexing, let's return our focus to how to use these in context of file paths. Working from within our Week2 project folder, let's see what directories (folders) are present -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.dirs(path=".", full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/00.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can also list any files that are present within our working directory using the `list.files()` function. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files() -``` - -::: - -::: {.fragment} - -![](images/01.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, in addition to our filepaths.qmd file, we can see the LICENSE and README files created when we set up the repository. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can also specify a particular folder we want to show items present within by changing the path argument. For example, if we wanted to see the contents of the "data" folder -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files(path="data", full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/02.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Which in this case returns the fcs files we copied over at the start of this lesson. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, there are no folders under "data". Let's go ahead and create a new one, calling it target. -::: -::: - ---- - -![](images/03.png) - ---- - -## Creating directories - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, we can also create a folder via R using the `dir.create()` function. Since we want it within data, we would modify the path accordingly -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -NewFolderLocation <- file.path("data", "target2") - -dir.create(path=NewFolderLocation) -``` - -::: - ---- - -![](images/04.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Before continuing, let's copy the first two .fcs files into both target and target2. -::: -::: - ---- - -![](images/06.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Given our working directory is set the top-level of the Week2 project folder, we can't just check inside nested target folders directly. If we attempt to: -::: -::: - -::: {.fragment} - -```{r} -list.files(path="target", full.names=FALSE, recursive=FALSE) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -No files are returned (ie, character(0)), since from our computers perspective, "target" doesn't exist within the active working directory. -::: -::: - -::: {.fragment} - -```{r} -file.exists("target") -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -On the other hand, within it's view, it knows that the data folder exist -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -file.exists("data") -``` - -::: - -::: {.fragment} - -![](images/05.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -So here we encounter the first challenge when communicating to our computer where to search for and find files. We need to provide a file.path that incorporates the path of folders between where the computer is currently at (ie. the working directory) and the target file itself. -::: -::: - ---- - -## File Paths - -::: {.fragment} -::: {.callout-tip title="."} -One way we can do this is through a file.path argument. We could potentially provide this by adding either a "/" or a "\" into the path argument, depending on your computers operating system. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files(path="data/target", full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/07.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -While this works in your particular context, if you are sharing the code with others who have a different operating system, these hard-coded / or \ will cause the code for them to error out at these particular steps. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For that reason, it is better to assemble a file.path using the `file.path()` function. This function takes into account the operating system, removing your need to have to worry about this particular computing nuance, and write code that is reproducible and replicable for everyone. -::: -::: - -::: {.fragment} - -```{r} -FolderLocation <- file.path("data", "target") -FolderLocation -``` - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files(path=FolderLocation, full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/07.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can also append additional locations to existing file paths, by including the variable name within the `file.path()` we are creating. -::: -::: - -::: {.fragment} - -```{r} -FolderLocation <- "data" -ScreenshotFolder <- file.path(FolderLocation, "target") -ScreenshotFolder -``` - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -list.files(path=ScreenshotFolder, full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/07.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Additionally, `list.files()` has the ability to filter for files that contain a particular character string. This can be useful is we are searching for ".fcs" or ".csv" files, but also for files that contain a particular word. In the case of the ScreenshotFolders -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files(path=ScreenshotFolder, pattern="ND050", full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/08.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will notice, the index numbers are in the context of what is filtered, not all the folder contents. -::: -::: - ---- - -## Selecting for Patterns - -::: {.fragment} -::: {.callout-tip title="."} -If we currently listed the files within data, we get a return that looks like this: -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -list.files("data", full.names=FALSE, recursive=FALSE) -``` - -::: - -::: {.fragment} - -![](images/09.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As you can see, we are getting back both folders and individual .fcs files. We could consequently change the pattern to provide a character string that will only return the .fcs files. We will go ahead and assign this list to a variable named files, for later retrieval. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -files <- list.files("data", pattern=".fcs", full.names=FALSE, recursive=FALSE) -files -``` - -::: - -::: {.fragment} - -![](images/10.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -One of the R packages we will be using througout the course is the `stringr` package. It contains two functions that can be useful when identifying more complicated character strings. In this case, if we run the `str_detect()` function to identify which of the .fcs files within the files variable contains the "INF" character string, we get a vector of logical (ie. True or FALSE) outputs corresponding to each file. -::: -::: - -::: {.fragment} - -```{r} -# install.packages("stringr") # CRAN -library(stringr) -``` - -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -str_detect(files, "INF") -``` - -::: - -::: {.fragment} - -![](images/11.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similar to how we indexed the Fluorophore list (ex. Fluorophore[1:2]) which returned a subset, we can similarly use this logical vector to subset files that returned as TRUE for containing the pattern "INF" -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -files[str_detect(files, "INF")] -``` - -::: - -::: {.fragment} - -![](images/12.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Let's go ahead and save these subsetted file names to a new variable, called Infants. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -Infants <- files[str_detect(files, "INF")] -``` - -::: - -## Conditionals - -::: {.fragment} -::: {.callout-tip title="."} -One useful thing is that within R, we can set conditions on whether something is carried out. The most typical conditional you will encounter are the "If" statements. They typically take a form that resembles the following. -::: -::: - - -::: {.fragment} - -```{r} -#| eval: FALSE - -NeedCoffee <- TRUE - -if (NeedCoffee){ - print("Take a break") -} -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case of the above, if the variable within the () is equal to true, the code within the {} will be executed. -::: -::: - -::: {.fragment} - -```{r} - -NeedCoffee <- TRUE - -if (NeedCoffee){ - print("Take a break") -} -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, when the variable within the () is equal to false, the code within the {} will not be executed. -::: -::: - -::: {.fragment} - -```{r} -NeedCoffee <- FALSE - -if (NeedCoffee){ - print("Take a break") -} -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -These "If" statements will trigger as long as the specified condition within the () is TRUE. For a different example: -::: -::: - -::: {.fragment} - -```{r} -RowNumber <- 299 -2 + RowNumber > 300 -``` - -::: - -::: {.fragment} - -```{r} -if (2 + RowNumber > 3){ - print("Stop Iterating") -} -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When you add an ! in front a conditional, it flips the expected outcome. -::: -::: - -::: {.fragment} - -```{r} -ItsRaining <- TRUE - -if (ItsRaining){print("Bring an Umbrella")} -``` - -::: - -::: {.fragment} - -```{r} -!ItsRaining -``` - -::: - -::: {.fragment} - -```{r} -if (!ItsRaining){print("Bring an Umbrella")} -``` - -::: - -::: {.fragment} - -```{r} -ItsRaining <- TRUE - -if (!ItsRaining){print("Bring Sunglasses")} - -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will explore more complicated conditionals throughout the course, but for now, let's implement a couple simple ones in the context of copying over the .fcs files in Infants over to a new target3 folder. -::: -::: - -## Conditionals in practice - -::: {.fragment} -::: {.callout-tip title="."} -First off, let's write a conditional to check if there is a target3 folder within data. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -files_present <- list.files("data", full.names=FALSE, recursive=FALSE) -files_present -``` - -::: - -::: {.fragment} - -![](images/13.png) - -::: - ---- - -```{r} -#| eval: FALSE - -FolderTarget3 <- file.path("data", "target3") -dir.exists(FolderTarget3) -``` - -::: {.fragment} - -![](images/14.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can write a conditional to create a folder if one does not yet exist. -::: -::: - - -::: {.fragment} - -```{r} -#| eval: FALSE -if (!dir.exists(FolderTarget3)){ - dir.create(FolderTarget3) -} -``` - -::: - -::: {.fragment} - -![](images/15.png) - -::: - ---- - -## Copying Files - -::: {.fragment} -::: {.callout-tip title="."} -To copy files to another folder location, we use the `file.copy()` function. It has two arguments that we will be working with, from being the .fcs files, and to being the folder location we wish to transfer them to. If we tried using them as we currently have them: -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -# Variable Infants containing 4 .fcs file names - -file.copy(from=Infants, to=FolderTarget3) -``` - -::: - -::: {.fragment} - -![](images/16.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The reason for this error is we are only working with a partial file path, as viewed from our Working directory. In this case, what is needed is the full file.path, so the file.path should also include the upstream folders from your current working directory. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -getwd() -``` - -::: - -::: {.fragment} - -![](images/17.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, we can update the .fcs files location by switching the full.names argument within `list.files()` from FALSE, to TRUE. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -files_present <- list.files("data", full.names=TRUE, recursive=FALSE) -files_present -``` - -::: - -::: {.fragment} - -![](images/18.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And filter for those containing "INF" again -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -Infants <- files_present[str_detect(files_present, "INF")] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And then try again: -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -# Variable Infants containing 4 .fcs file names - -file.copy(from=Infants, to=FolderTarget3) -``` - -::: - -::: {.fragment} - -![](images/19.png) - -::: - ---- - -## Removing files. - -::: {.fragment} -::: {.callout-tip title="."} -Just like we can add files via R, we can also remove them. However, when we remove them via this route, they are removed permanently, not sent to the recycle bin. We will revisit how later on in the course after you have gained additional experience with file.paths. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -?unlink() -``` - -::: - -## Basename - -::: {.fragment} -::: {.callout-tip title="."} -If we look at Infants with the full.names=TRUE, we see the additional pathing folder has been added, allowing us to successfully copy over the files. -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -Infants -``` - -::: - -::: {.fragment} - -![](images/20.png) - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we were trying to retrieve just the local file names from the full.names, we could do so with `basename()` function. We will use this in combination with additional arguments later in the course -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -basename(Infants) -``` - -::: - -::: {.fragment} - -![](images/22.png) - -::: - ---- - -## Recursive - - -::: {.fragment} -::: {.callout-tip title="."} -And finally that we have created additional nested folders and populated them with fcs files, let's see what setting `list.files()` recursive argument to TRUE -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE -all_files_present <- list.files(full.names=TRUE, recursive=TRUE) -all_files_present -``` - -::: - ---- - -![](images/RecursiveTrue.png) - ---- - - -::: {.fragment} -::: {.callout-tip title="."} - -In this case, all files in all folders within the working directory are shown. This can be useful when exploring folder contents, but if there are a lot of files present within the folder, it will take a while to return the list. - -::: -::: - - -## Saving changes to Version Control - -::: {.fragment} -::: {.callout-tip title="."} -And as is good practice, to maintain version control, let's stage all the files and folders we created today within the Week2 Project Folder, write a commit message, and send these files back to GitHub until they are needed again next time. -::: -::: - ---- - -![](images/23.png) - ---- - -# Wrap-Up - -::: {.fragment} -::: {.callout-tip title="."} -In this session, we started to learn about working directories, file.paths and how to locate files of interest. We also learned how variables (objects) are created in R using the assignment arrow, how they are named, and the general structure (character, numeric, logical) that they are represented as. - -This will prove valuable in the next several weeks when working with .fcs files, as the majority of functions we will use for Bioconductor project R packages need file.paths to locate both .fcs files as well as .csv files that contain metadata. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -One of the most frequent errors that beginners encounter when trying to load in .fcs files into the `flowCore` package is not providing the full file.path to the .fcs file of interest. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next week, having installed the required R packages, and learned a little about variables and file.paths, we will dive into our first cytometry focused session. We will be cracking open an .fcs file and exploring how things are stored within. In the process of seeing how the file contents are organized, we will continue to learn and practice how to create variables, and general object structure types within R. Until then, have a wonderful week! -::: -::: - ---- - -![](images/Week2Exit.jpg) - ---- - -# Additional Resources - -[Riffomonas: Using paths in R and why you shouldn't be using setwd (CC179)](https://youtu.be/StqDYjM6ULo?si=ba2on5rNphQ9AL-B) - -[Project-oriented workflow](https://tidyverse.org/blog/2017/12/workflow-vs-script/) - -[Paths, working directories, and projects in R; Learn R Video 13](https://youtu.be/lJcuXBFP7Co?si=dqptQ3UGGjmTYqnB) - -[Demystifying File Paths in R: Navigate Nested Folders with Dr. Padilla](https://youtu.be/yeiT5Kj_uG8?si=UySsolzbTxbgGMF6) - -# Take-home Problems - -:::{.callout-tip title="Problem 1"} -Plug in an external hard-drive or USB into your computer. Manually, create a folder within called "TargetFolder". Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D -::: - ---- - -:::{.callout-tip title="Problem 2"} -In this session, we used `list.files()` with the "full.names argument" set to TRUE, as well as the `basename()` function to identify specific files. But what if you wanted a particular directory. Run `list.files()` with "full.names argument" and "recursive" argument set to TRUE, and then search online to find an R function that would retrieve the "" individual directory folders. -::: - ---- - -:::{.callout-tip title="Problem 3"} -R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the `system.file()` function. See an example code below. - -```{r} -#| eval: FALSE -system.file("extdata", package = "FlowSOM") -``` - -Using what we have learned about file.path navigation, search your way down the file.directory of the `FlowSOM` and `flowWorkspace` packages, and identify any .fcs files that are present for use in the documentation. -::: - ---- - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) -::: +--- +title: "02 - File Paths" +author: "David Rach" +date: 02-16-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Welcome to the second week of [Cytometry in R](/Schedule.qmd)! This week we will learn about file.path, namely, how to communicate to our computer (and R) where various files are stored. +::: +::: + +::: {.fragment} +:::{.callout-important} +Before getting started, please make sure you have completed the creating a [GitHub](/course/00_GitHub/index.qmd) and [Workstation Setup](/course/00_WorkstationSetup/index.qmd) walk-throughs, since we will begin where they left off once the required software was successfully installed. Having read-through how to use [version control](/course/00_Git/index.qmd) using Git will additionally be useful. +::: +::: + +--- + +# Background + +```{r} +#| include: FALSE +library(BiocStyle) +``` + + +::: {.fragment} +::: {.callout-tip title="."} +When flow cytometrist first start learning how to code, we tend to think big picture: "I want to take my files, normalize them, cluster them, analyze them, and finally plot them". When we first start writing code, we tend to plan what we will write in similarly broad strokes. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Our computers by contrast "think" in small incremental steps: "First locate this folder, list the files present, select these specific ones, import them into R, load the normalization package, pass the first file in, etc.". These steps when combined algorithmically add up to form the bigger picture. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The challenge when first starting to learn how to code is developing a coding mindset in which we think not in broad strokes, but about what the next step will be programmatically. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will start working on our own "coding mindsets" by working with file paths, as they communicate to our computer where to find our experiment files, and tend to be one of the early points of conflict and frustration. In the process, we will also cover additional concepts of R programming generally, including how to create/name variables, and look up the class/type of a particular object. +::: +::: + +--- + +## Set Up + + +::: {.fragment} +::: {.callout-tip title="."} +Before we begin, let's make sure you get the data needed for today transferred to your local computer, and then get the .fcs files copied over from there to your own working project folder. This is the process you will repeat each week throughout the course. +::: +::: + +--- + +### New Repository + +::: {.fragment} +::: {.callout-tip title="."} +First off, login to your GitHub account. Once there, you will select the options to create a new repository (similar to what you did during [Using GitHub](/course/00_GitHub/index.qmd#github-repository)) +::: +::: + +--- + +![](images/0001_NewRepo.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For this week, let's set this new repository up as a private repository, and call it Week2. This will keep things consistent with the file.paths we will be showing in the examples. +::: +::: + +--- + +![](images/0002_PrivateRepo.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once the new repository has been created, copy the URL. +::: +::: + +--- + +![](images/0003_Url.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next, open up Positron, set the interpreter to use R, and then select the option to bring in a "New Folder from Git". +::: +::: + +--- + +![](images/0004_NewGit.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Paste in your new repository's url. Additionally, if you want to match file.paths shown in the examples, set your storage location to your local Documents folder (please note the start of the file.path will look differently depending on whether you are on Windows, MacOS, or Linux). +::: +::: + +--- + +![](images/0005_SaveDocuments.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Your new repository will then be imported from GitHub. Once this is done, create two subfolders (data and images) and a new .qmd file (naming it filepaths.qmd). +::: +::: + +--- + +![](images/0006_BasicInfrastructure.png) + +--- + +### Sync + +::: {.fragment} +::: {.callout-tip title="."} +With this done, return to GitHub and open your [forked version](/course/00_GitHub/index.qmd#forking-cytometryinr) of the CytometryInR course folder. If you haven't yet done so, click on [sync](/course/00_Homeworks/index.qmd#sync-your-fork) to bring in this week's code and datasets. +::: +::: + +--- + +![](images/0008_Sync.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Returning to Positron, you will need to switch Project Folders, switching from Week2 over to CytometryInR. +::: +::: + +--- + +![](images/0007_SwitchFolders.png) + +--- + +### Pull + +::: {.fragment} +::: {.callout-tip title="."} +Once CytometryInR project folder has opened, you will need to [pull](/course/00_Git/index.qmd#pull) in the new data from GitHub to your local computer. +::: +::: + +--- + +![](images/0007_PullCytometryInR.png) + +--- + +### Copy Files to Week2 + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, you will see within the course folder, containing this weeks folder (02_FilePaths). Within it there is a data folder with .fcs files. To avoid causing conflicts when bringing in next week's materials, you will want to manually copy over these .fcs files (via your File Explorer) to the data folder within your "Week2" Project Folder. +::: +::: + +--- + +![](images/0009_Copy.png) + +--- + +### Commit and Push + + +::: {.fragment} +::: {.callout-tip title="."} +When you reopen your Week2 project folder in Positron, you should now be able to see the .fcs files within the data folder. Next, from the action bar on the far left, select the Source Control tab. Stage all the changes (as was done in [Using Git](/course/00_Git/)), and write a short commit message. +::: +::: + +--- + +![](images/0010_Commit.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With these files now being tracked by version control, push (ie. send) your changes to GitHub so that they are remotely backed up. +::: +::: + +--- + +![](images/0011_Push.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And with this setup complete, you are now ready to proceed. Remember, run code and write notes in your working project folder (Week2 or otherwise named) to avoid conflicts next week in the CytometryInR folder when you are trying to bring in the Week #3 code and datasets. +::: +::: + +--- + +# Walk Through + +## Working Directory + +::: {.fragment} +::: {.callout-tip title="."} +Now that we are back in our Week2 folder, let's start by seeing our current location similarly to how our computer perceives it. + +We will use `getwd()` function (ie. get working directory) to return the location of the folder we are currently inside of. For example, when `getwd()` is run within my Week2 project folder, I see the following location +::: +::: + +--- + +```{r} +#| eval: FALSE +getwd() +``` + +![](images/0000_ReplacementGetWD.png) + +::: {.fragment} +::: {.callout-tip title="."} + +This returns a file path. The final location (Week2 in this case) is the **Working Directory**. Your computer when working in R will be descern other locations in relation to this directory. + +::: +::: + +--- + +## Directories + +::: {.fragment} +::: {.callout-tip title="."} +Within this working directory, we have a variety of project folders and files related to the course. We can see the folders that are present using the `list.dirs()` function. +::: +::: + +::: {.fragment} +![](images/0000_ReplacementView.png) +::: + +::: fragment +```{r} +#| eval: FALSE +list.dirs(path=".", full.names=FALSE, recursive=FALSE) +``` + +![](images/0000_ReplacementListFiles.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Within this `list.dirs()` function, we are specifying two arguments with which we will be working with later today, *full.names* and *recursive*. For now, lets set their arguments to FALSE, which means they conditions they implement are inactive (turned off). +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The path argument is currently set to ".", which is a stand-in for the present directory. In R, if an argument is not specified directly, it is inferred based on an order of expected arguments. Thus, if not present, we could still get the same output as seen before. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +list.dirs(full.names=FALSE, recursive=FALSE) +``` + +![](images/0000_ReplacementListFiles.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Within Positron, in addition to visible folders, we also have *hidden folders* (denoted by the "." in front of the folder name when using `list.dirs()`). In the case of one of our course website folders, we can see a ".quarto" folder shown in a lighter gray . The ".git" folder we saw from `list.dirs()` is typically hidden when viewing from Positron. +::: +::: + +::: {.fragment} + +![](images/02_HiddenFolder.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the case of Week2, the two not-hidden folders we created are listed. We will see how to navigate these in a second. +::: +::: + +::: {.fragment} + +![](images/0000_ReplacementView.png) + +::: + +--- + +## Variables + +::: {.fragment} +::: {.callout-tip title="."} +Before exploring file paths, we need to have some basic R code knowledge that we can use to work with them. Within R, we have the ability to assign particular values (be they character strings, numbers or logicals) to objects (ie. variables) that can be used when called upon later. + +For example: + +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +WhatDayDidIWriteThis <- "Saturday" +``` +::: + +::: {.fragment} +::: {.callout-tip title="."} +In this case, the variable name is what the assignment arrow ("<-") is pointing at. In this case, WhatDayDidIWriteThis +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When we run this, we create a variable, that will appear within the right-sidebar. +::: +::: + +::: {.fragment} + +```{r} +#| eval: TRUE +WhatDayDidIWriteThis <- "Saturday" +``` + +::: + +--- + +![](images/04_VariableList.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +These variables can subsequently be retrieved by printing (ie. running) the name of the variable +::: +::: + +::: {.fragment} + +```{r} +WhatDayDidIWriteThis +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You can create variables with almost any name you can think of +::: +::: + +::: {.fragment} + +```{r} +TopSecretMeetingDay <- "Saturday" +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With a few exceptions. R doesn't play well with spaces: +::: +::: + +::: {.fragment} + +```{r} +#| error: TRUE +Top Secret Meeting Day <- "Saturday" +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +But does play well with underscores: +::: +::: + +::: {.fragment} + +```{r} +Top_Secret_Meeting_Day <- "Saturday" +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The above (with individual words separated by _) is collectively known as snake case. The alternate way to help delineate variable names is "camelCase", with first letter of each word being capitalized (seen in the previous example). +::: +::: + +--- + +![](images/CamelCase.jpeg) + +--- + +```{r} +TopSecretMeetingDay +``` + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You can overwrite a Variable name by assigning a different value to it: +::: +::: + +::: {.fragment} + +```{r} +TopSecretMeetingDay <- "Monday" +``` + +::: + +::: {.fragment} + +```{r} +TopSecretMeetingDay +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You can also remove individual variables via the `rm` function +::: +::: + +::: {.fragment} + +```{r} +rm(Top_Secret_Meeting_Day) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Or if trying to remove all, via the right sidebar +::: +::: + +--- + +![](images/10_RemoveVariables.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the prior case, we are creating a variable that is a "string" of character values, due to our use of "" around the word. We can see this when we use the `str()` function. +::: +::: + +::: {.fragment} + +```{r} +Fluorophores <- "FITC" +str(Fluorophores) +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} +The "chr" in front denotating that Fluorophores contains a character string. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This could also be retrieved using the `class()` function. +::: +::: + +::: {.fragment} + +```{r} +class(Fluorophores) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we could assign a numeric value to a variable +::: +::: + +::: {.fragment} + +```{r} +Fluorophores <- 29 +str(Fluorophores) +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} +Which returns "num", ie. numeric. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also specify a logical (ie. True or FALSE) to a particular object +::: +::: + +::: {.fragment} + +```{r} +IsPerCPCy5AGoodFluorophore <- FALSE +str(IsPerCPCy5AGoodFluorophore) +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} +Which returns logi in front, denoting this variable contains a logical value. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Last week, when we were installing `dplyr`, the reason that installation failed was `install.packages()` expects a character string. However, when we left off the "", it looked within our local environments created variables for the dplyr variable, couldn't find it, and thus failed. + +We could of course, have assigned a character value to a variable name, and then used that variable name, which would have worked. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +PackageToInstall <- "dplyr" + +install.packages(PackageToInstall) +``` + +::: + +--- + +## Indexing + +::: {.fragment} +::: {.callout-tip title="."} +Not all variables contain single objects. + +For example, we can modify Fluorophores and add additional entries: +::: +::: + +::: {.fragment} + +```{r} +Fluorophores <- c("BV421", "FITC", "PE", "APC") +str(Fluorophores) +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} +The c stands for concatenate. It concatenates the objects into a larger object, known as a vector. + +In this case, you notice in addition to the specification the values are characters, we get a [1:4], denoting four objects are present. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can similarly retrieve this information using the `length()` function +::: +::: + +::: {.fragment} + +```{r} +length(Fluorophores) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When multiple objects are present, we can specify them individidually by providing their index number within square brackets []. +::: +::: + + +::: {.fragment} + +```{r} +Fluorophores[1] +``` + +::: + +--- + +::: {.fragment} + +```{r} +Fluorophores[3] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Or specify in sequence using a colon (:) +::: +::: + +::: {.fragment} + +```{r} +Fluorophores[3:4] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Or if not adjacent, reusing `c` within the square brackets +::: +::: + +::: {.fragment} + +```{r} +Fluorophores[c(1,4)] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will revisit these concepts throughout the course, with what we have covered today, this will help us create file.paths and select fcs files that we want to work with via index number. +::: +::: + +## Listing Files + +::: {.fragment} +::: {.callout-tip title="."} +After this detour into variables and indexing, let's return our focus to how to use these in context of file paths. Working from within our Week2 project folder, let's see what directories (folders) are present +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.dirs(path=".", full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/00.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also list any files that are present within our working directory using the `list.files()` function. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files() +``` + +::: + +::: {.fragment} + +![](images/01.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, in addition to our filepaths.qmd file, we can see the LICENSE and README files created when we set up the repository. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also specify a particular folder we want to show items present within by changing the path argument. For example, if we wanted to see the contents of the "data" folder +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files(path="data", full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/02.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which in this case returns the fcs files we copied over at the start of this lesson. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, there are no folders under "data". Let's go ahead and create a new one, calling it target. +::: +::: + +--- + +![](images/03.png) + +--- + +## Creating directories + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we can also create a folder via R using the `dir.create()` function. Since we want it within data, we would modify the path accordingly +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +NewFolderLocation <- file.path("data", "target2") + +dir.create(path=NewFolderLocation) +``` + +::: + +--- + +![](images/04.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Before continuing, let's copy the first two .fcs files into both target and target2. +::: +::: + +--- + +![](images/06.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Given our working directory is set the top-level of the Week2 project folder, we can't just check inside nested target folders directly. If we attempt to: +::: +::: + +::: {.fragment} + +```{r} +list.files(path="target", full.names=FALSE, recursive=FALSE) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +No files are returned (ie, character(0)), since from our computers perspective, "target" doesn't exist within the active working directory. +::: +::: + +::: {.fragment} + +```{r} +file.exists("target") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On the other hand, within it's view, it knows that the data folder exist +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +file.exists("data") +``` + +::: + +::: {.fragment} + +![](images/05.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +So here we encounter the first challenge when communicating to our computer where to search for and find files. We need to provide a file.path that incorporates the path of folders between where the computer is currently at (ie. the working directory) and the target file itself. +::: +::: + +--- + +## File Paths + +::: {.fragment} +::: {.callout-tip title="."} +One way we can do this is through a file.path argument. We could potentially provide this by adding either a "/" or a "\" into the path argument, depending on your computers operating system. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files(path="data/target", full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/07.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +While this works in your particular context, if you are sharing the code with others who have a different operating system, these hard-coded / or \ will cause the code for them to error out at these particular steps. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For that reason, it is better to assemble a file.path using the `file.path()` function. This function takes into account the operating system, removing your need to have to worry about this particular computing nuance, and write code that is reproducible and replicable for everyone. +::: +::: + +::: {.fragment} + +```{r} +FolderLocation <- file.path("data", "target") +FolderLocation +``` + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files(path=FolderLocation, full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/07.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also append additional locations to existing file paths, by including the variable name within the `file.path()` we are creating. +::: +::: + +::: {.fragment} + +```{r} +FolderLocation <- "data" +ScreenshotFolder <- file.path(FolderLocation, "target") +ScreenshotFolder +``` + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +list.files(path=ScreenshotFolder, full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/07.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Additionally, `list.files()` has the ability to filter for files that contain a particular character string. This can be useful is we are searching for ".fcs" or ".csv" files, but also for files that contain a particular word. In the case of the ScreenshotFolders +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files(path=ScreenshotFolder, pattern="ND050", full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/08.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice, the index numbers are in the context of what is filtered, not all the folder contents. +::: +::: + +--- + +## Selecting for Patterns + +::: {.fragment} +::: {.callout-tip title="."} +If we currently listed the files within data, we get a return that looks like this: +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +list.files("data", full.names=FALSE, recursive=FALSE) +``` + +::: + +::: {.fragment} + +![](images/09.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As you can see, we are getting back both folders and individual .fcs files. We could consequently change the pattern to provide a character string that will only return the .fcs files. We will go ahead and assign this list to a variable named files, for later retrieval. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +files <- list.files("data", pattern=".fcs", full.names=FALSE, recursive=FALSE) +files +``` + +::: + +::: {.fragment} + +![](images/10.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +One of the R packages we will be using througout the course is the `stringr` package. It contains two functions that can be useful when identifying more complicated character strings. In this case, if we run the `str_detect()` function to identify which of the .fcs files within the files variable contains the "INF" character string, we get a vector of logical (ie. True or FALSE) outputs corresponding to each file. +::: +::: + +::: {.fragment} + +```{r} +# install.packages("stringr") # CRAN +library(stringr) +``` + +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +str_detect(files, "INF") +``` + +::: + +::: {.fragment} + +![](images/11.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to how we indexed the Fluorophore list (ex. Fluorophore[1:2]) which returned a subset, we can similarly use this logical vector to subset files that returned as TRUE for containing the pattern "INF" +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +files[str_detect(files, "INF")] +``` + +::: + +::: {.fragment} + +![](images/12.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's go ahead and save these subsetted file names to a new variable, called Infants. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +Infants <- files[str_detect(files, "INF")] +``` + +::: + +## Conditionals + +::: {.fragment} +::: {.callout-tip title="."} +One useful thing is that within R, we can set conditions on whether something is carried out. The most typical conditional you will encounter are the "If" statements. They typically take a form that resembles the following. +::: +::: + + +::: {.fragment} + +```{r} +#| eval: FALSE + +NeedCoffee <- TRUE + +if (NeedCoffee){ + print("Take a break") +} +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case of the above, if the variable within the () is equal to true, the code within the {} will be executed. +::: +::: + +::: {.fragment} + +```{r} + +NeedCoffee <- TRUE + +if (NeedCoffee){ + print("Take a break") +} +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, when the variable within the () is equal to false, the code within the {} will not be executed. +::: +::: + +::: {.fragment} + +```{r} +NeedCoffee <- FALSE + +if (NeedCoffee){ + print("Take a break") +} +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +These "If" statements will trigger as long as the specified condition within the () is TRUE. For a different example: +::: +::: + +::: {.fragment} + +```{r} +RowNumber <- 299 +2 + RowNumber > 300 +``` + +::: + +::: {.fragment} + +```{r} +if (2 + RowNumber > 3){ + print("Stop Iterating") +} +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When you add an ! in front a conditional, it flips the expected outcome. +::: +::: + +::: {.fragment} + +```{r} +ItsRaining <- TRUE + +if (ItsRaining){print("Bring an Umbrella")} +``` + +::: + +::: {.fragment} + +```{r} +!ItsRaining +``` + +::: + +::: {.fragment} + +```{r} +if (!ItsRaining){print("Bring an Umbrella")} +``` + +::: + +::: {.fragment} + +```{r} +ItsRaining <- TRUE + +if (!ItsRaining){print("Bring Sunglasses")} + +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will explore more complicated conditionals throughout the course, but for now, let's implement a couple simple ones in the context of copying over the .fcs files in Infants over to a new target3 folder. +::: +::: + +## Conditionals in practice + +::: {.fragment} +::: {.callout-tip title="."} +First off, let's write a conditional to check if there is a target3 folder within data. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +files_present <- list.files("data", full.names=FALSE, recursive=FALSE) +files_present +``` + +::: + +::: {.fragment} + +![](images/13.png) + +::: + +--- + +```{r} +#| eval: FALSE + +FolderTarget3 <- file.path("data", "target3") +dir.exists(FolderTarget3) +``` + +::: {.fragment} + +![](images/14.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can write a conditional to create a folder if one does not yet exist. +::: +::: + + +::: {.fragment} + +```{r} +#| eval: FALSE +if (!dir.exists(FolderTarget3)){ + dir.create(FolderTarget3) +} +``` + +::: + +::: {.fragment} + +![](images/15.png) + +::: + +--- + +## Copying Files + +::: {.fragment} +::: {.callout-tip title="."} +To copy files to another folder location, we use the `file.copy()` function. It has two arguments that we will be working with, from being the .fcs files, and to being the folder location we wish to transfer them to. If we tried using them as we currently have them: +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +# Variable Infants containing 4 .fcs file names + +file.copy(from=Infants, to=FolderTarget3) +``` + +::: + +::: {.fragment} + +![](images/16.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The reason for this error is we are only working with a partial file path, as viewed from our Working directory. In this case, what is needed is the full file.path, so the file.path should also include the upstream folders from your current working directory. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +getwd() +``` + +::: + +::: {.fragment} + +![](images/17.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, we can update the .fcs files location by switching the full.names argument within `list.files()` from FALSE, to TRUE. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +files_present <- list.files("data", full.names=TRUE, recursive=FALSE) +files_present +``` + +::: + +::: {.fragment} + +![](images/18.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And filter for those containing "INF" again +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +Infants <- files_present[str_detect(files_present, "INF")] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And then try again: +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +# Variable Infants containing 4 .fcs file names + +file.copy(from=Infants, to=FolderTarget3) +``` + +::: + +::: {.fragment} + +![](images/19.png) + +::: + +--- + +## Removing files. + +::: {.fragment} +::: {.callout-tip title="."} +Just like we can add files via R, we can also remove them. However, when we remove them via this route, they are removed permanently, not sent to the recycle bin. We will revisit how later on in the course after you have gained additional experience with file.paths. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +?unlink() +``` + +::: + +## Basename + +::: {.fragment} +::: {.callout-tip title="."} +If we look at Infants with the full.names=TRUE, we see the additional pathing folder has been added, allowing us to successfully copy over the files. +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +Infants +``` + +::: + +::: {.fragment} + +![](images/20.png) + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were trying to retrieve just the local file names from the full.names, we could do so with `basename()` function. We will use this in combination with additional arguments later in the course +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +basename(Infants) +``` + +::: + +::: {.fragment} + +![](images/22.png) + +::: + +--- + +## Recursive + + +::: {.fragment} +::: {.callout-tip title="."} +And finally that we have created additional nested folders and populated them with fcs files, let's see what setting `list.files()` recursive argument to TRUE +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE +all_files_present <- list.files(full.names=TRUE, recursive=TRUE) +all_files_present +``` + +::: + +--- + +![](images/RecursiveTrue.png) + +--- + + +::: {.fragment} +::: {.callout-tip title="."} + +In this case, all files in all folders within the working directory are shown. This can be useful when exploring folder contents, but if there are a lot of files present within the folder, it will take a while to return the list. + +::: +::: + + +## Saving changes to Version Control + +::: {.fragment} +::: {.callout-tip title="."} +And as is good practice, to maintain version control, let's stage all the files and folders we created today within the Week2 Project Folder, write a commit message, and send these files back to GitHub until they are needed again next time. +::: +::: + +--- + +![](images/23.png) + +--- + +# Wrap-Up + +::: {.fragment} +::: {.callout-tip title="."} +In this session, we started to learn about working directories, file.paths and how to locate files of interest. We also learned how variables (objects) are created in R using the assignment arrow, how they are named, and the general structure (character, numeric, logical) that they are represented as. + +This will prove valuable in the next several weeks when working with .fcs files, as the majority of functions we will use for Bioconductor project R packages need file.paths to locate both .fcs files as well as .csv files that contain metadata. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +One of the most frequent errors that beginners encounter when trying to load in .fcs files into the `flowCore` package is not providing the full file.path to the .fcs file of interest. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next week, having installed the required R packages, and learned a little about variables and file.paths, we will dive into our first cytometry focused session. We will be cracking open an .fcs file and exploring how things are stored within. In the process of seeing how the file contents are organized, we will continue to learn and practice how to create variables, and general object structure types within R. Until then, have a wonderful week! +::: +::: + +--- + +![](images/Week2Exit.jpg) + +--- + +# Additional Resources + +[Riffomonas: Using paths in R and why you shouldn't be using setwd (CC179)](https://youtu.be/StqDYjM6ULo?si=ba2on5rNphQ9AL-B) + +[Project-oriented workflow](https://tidyverse.org/blog/2017/12/workflow-vs-script/) + +[Paths, working directories, and projects in R; Learn R Video 13](https://youtu.be/lJcuXBFP7Co?si=dqptQ3UGGjmTYqnB) + +[Demystifying File Paths in R: Navigate Nested Folders with Dr. Padilla](https://youtu.be/yeiT5Kj_uG8?si=UySsolzbTxbgGMF6) + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Plug in an external hard-drive or USB into your computer. Manually, create a folder within called "TargetFolder". Try to programmatically specify the file path to identify the folders and files present on your external drive. Then, try to copy your .fcs files from their current folder on your desktop to the TargetFolder on your drive using R. Remember, just copy, no deletion, you need to walk before you can run :D +::: + +--- + +:::{.callout-tip title="Problem 2"} +In this session, we used `list.files()` with the "full.names argument" set to TRUE, as well as the `basename()` function to identify specific files. But what if you wanted a particular directory. Run `list.files()` with "full.names argument" and "recursive" argument set to TRUE, and then search online to find an R function that would retrieve the "" individual directory folders. +::: + +--- + +:::{.callout-tip title="Problem 3"} +R packages often come with internal datasets, that are typically used for use in the help documentation examples. These can be accessed through the use of the `system.file()` function. See an example code below. + +```{r} +#| eval: FALSE +system.file("extdata", package = "FlowSOM") +``` + +Using what we have learned about file.path navigation, search your way down the file.directory of the `FlowSOM` and `flowWorkspace` packages, and identify any .fcs files that are present for use in the documentation. +::: + +--- + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: diff --git a/course/03_InsideFCSFile/data/BioconductorDownloads.csv b/course/03_InsideFCSFile/data/BioconductorDownloads.csv index 4ca5bee..14f3689 100644 --- a/course/03_InsideFCSFile/data/BioconductorDownloads.csv +++ b/course/03_InsideFCSFile/data/BioconductorDownloads.csv @@ -1,885 +1,885 @@ -"Year","Month","Nb_of_distinct_IPs","Nb_of_downloads","package" -2025,"Jan",2233,4445,"flowCore" -2025,"Feb",2376,4254,"flowCore" -2025,"Mar",2691,5218,"flowCore" -2025,"Apr",2660,5098,"flowCore" -2025,"May",2643,5838,"flowCore" -2025,"Jun",2523,5070,"flowCore" -2025,"Jul",2887,5789,"flowCore" -2025,"Aug",2592,15192,"flowCore" -2025,"Sep",3039,38024,"flowCore" -2025,"Oct",2958,15956,"flowCore" -2025,"Nov",3645,10389,"flowCore" -2025,"Dec",3982,14260,"flowCore" -2025,"all",26720,129533,"flowCore" -2025,"Jan",2501,4902,"cytolib" -2025,"Feb",2588,4534,"cytolib" -2025,"Mar",2755,5463,"cytolib" -2025,"Apr",2741,4785,"cytolib" -2025,"May",2545,4725,"cytolib" -2025,"Jun",2325,3897,"cytolib" -2025,"Jul",2731,4705,"cytolib" -2025,"Aug",2358,14116,"cytolib" -2025,"Sep",2868,37708,"cytolib" -2025,"Oct",2867,15757,"cytolib" -2025,"Nov",3500,9793,"cytolib" -2025,"Dec",3167,12209,"cytolib" -2025,"all",25638,122594,"cytolib" -2025,"Jan",1006,2206,"flowWorkspace" -2025,"Feb",980,1802,"flowWorkspace" -2025,"Mar",1386,2734,"flowWorkspace" -2025,"Apr",1330,2614,"flowWorkspace" -2025,"May",1381,3229,"flowWorkspace" -2025,"Jun",1200,2420,"flowWorkspace" -2025,"Jul",1469,2894,"flowWorkspace" -2025,"Aug",1242,6409,"flowWorkspace" -2025,"Sep",1515,22768,"flowWorkspace" -2025,"Oct",1506,8677,"flowWorkspace" -2025,"Nov",1936,5480,"flowWorkspace" -2025,"Dec",2406,9893,"flowWorkspace" -2025,"all",13542,71126,"flowWorkspace" -2025,"Jan",1066,2080,"ncdfFlow" -2025,"Feb",1038,1758,"ncdfFlow" -2025,"Mar",1246,2295,"ncdfFlow" -2025,"Apr",1235,2103,"ncdfFlow" -2025,"May",1251,2417,"ncdfFlow" -2025,"Jun",1040,1635,"ncdfFlow" -2025,"Jul",1227,1962,"ncdfFlow" -2025,"Aug",1157,5939,"ncdfFlow" -2025,"Sep",1410,22562,"ncdfFlow" -2025,"Oct",1438,8643,"ncdfFlow" -2025,"Nov",1846,4987,"ncdfFlow" -2025,"Dec",2465,8821,"ncdfFlow" -2025,"all",12958,65202,"ncdfFlow" -2025,"Jan",869,1692,"flowViz" -2025,"Feb",851,1372,"flowViz" -2025,"Mar",1014,1763,"flowViz" -2025,"Apr",1000,1762,"flowViz" -2025,"May",1042,1879,"flowViz" -2025,"Jun",862,1338,"flowViz" -2025,"Jul",1023,1520,"flowViz" -2025,"Aug",1028,7336,"flowViz" -2025,"Sep",1192,23253,"flowViz" -2025,"Oct",1222,8503,"flowViz" -2025,"Nov",1529,4913,"flowViz" -2025,"Dec",2477,10579,"flowViz" -2025,"all",11266,65910,"flowViz" -2025,"Jan",1014,1814,"FlowSOM" -2025,"Feb",943,1553,"FlowSOM" -2025,"Mar",1029,1769,"FlowSOM" -2025,"Apr",1163,2102,"FlowSOM" -2025,"May",1074,2057,"FlowSOM" -2025,"Jun",995,1658,"FlowSOM" -2025,"Jul",1211,2098,"FlowSOM" -2025,"Aug",1056,4924,"FlowSOM" -2025,"Sep",1360,14884,"FlowSOM" -2025,"Oct",1281,5173,"FlowSOM" -2025,"Nov",1523,4312,"FlowSOM" -2025,"Dec",1841,7558,"FlowSOM" -2025,"all",11129,49902,"FlowSOM" -2025,"Jan",724,1521,"ggcyto" -2025,"Feb",712,1225,"ggcyto" -2025,"Mar",930,1603,"ggcyto" -2025,"Apr",1028,1838,"ggcyto" -2025,"May",1103,2232,"ggcyto" -2025,"Jun",849,1537,"ggcyto" -2025,"Jul",1026,1839,"ggcyto" -2025,"Aug",885,5193,"ggcyto" -2025,"Sep",1133,16596,"ggcyto" -2025,"Oct",1249,6653,"ggcyto" -2025,"Nov",1393,4083,"ggcyto" -2025,"Dec",1850,8319,"ggcyto" -2025,"all",10062,52639,"ggcyto" -2025,"Jan",592,1291,"openCyto" -2025,"Feb",582,1029,"openCyto" -2025,"Mar",711,1281,"openCyto" -2025,"Apr",720,1365,"openCyto" -2025,"May",745,1589,"openCyto" -2025,"Jun",675,1266,"openCyto" -2025,"Jul",798,1544,"openCyto" -2025,"Aug",759,4851,"openCyto" -2025,"Sep",989,19126,"openCyto" -2025,"Oct",953,5720,"openCyto" -2025,"Nov",1196,3753,"openCyto" -2025,"Dec",1916,8847,"openCyto" -2025,"all",8214,51662,"openCyto" -2025,"Jan",579,971,"quantiseqr" -2025,"Feb",633,957,"quantiseqr" -2025,"Mar",684,1052,"quantiseqr" -2025,"Apr",757,1131,"quantiseqr" -2025,"May",811,1260,"quantiseqr" -2025,"Jun",773,1188,"quantiseqr" -2025,"Jul",855,1349,"quantiseqr" -2025,"Aug",762,1025,"quantiseqr" -2025,"Sep",1111,1655,"quantiseqr" -2025,"Oct",917,1239,"quantiseqr" -2025,"Nov",1088,1474,"quantiseqr" -2025,"Dec",1057,1394,"quantiseqr" -2025,"all",8760,14695,"quantiseqr" -2025,"Jan",478,1039,"flowStats" -2025,"Feb",450,800,"flowStats" -2025,"Mar",450,884,"flowStats" -2025,"Apr",599,1173,"flowStats" -2025,"May",619,1325,"flowStats" -2025,"Jun",527,1014,"flowStats" -2025,"Jul",686,1230,"flowStats" -2025,"Aug",643,4856,"flowStats" -2025,"Sep",782,19103,"flowStats" -2025,"Oct",764,6182,"flowStats" -2025,"Nov",1134,3335,"flowStats" -2025,"Dec",1835,7470,"flowStats" -2025,"all",6792,48411,"flowStats" -2025,"Jan",458,1124,"CytoML" -2025,"Feb",424,859,"CytoML" -2025,"Mar",547,1169,"CytoML" -2025,"Apr",586,1135,"CytoML" -2025,"May",536,1150,"CytoML" -2025,"Jun",480,940,"CytoML" -2025,"Jul",627,1229,"CytoML" -2025,"Aug",575,4261,"CytoML" -2025,"Sep",720,14501,"CytoML" -2025,"Oct",738,4396,"CytoML" -2025,"Nov",852,2933,"CytoML" -2025,"Dec",1234,6871,"CytoML" -2025,"all",5688,40568,"CytoML" -2025,"Jan",467,1075,"CATALYST" -2025,"Feb",419,983,"CATALYST" -2025,"Mar",472,1075,"CATALYST" -2025,"Apr",530,1213,"CATALYST" -2025,"May",555,1284,"CATALYST" -2025,"Jun",534,1058,"CATALYST" -2025,"Jul",689,1307,"CATALYST" -2025,"Aug",552,2044,"CATALYST" -2025,"Sep",714,8339,"CATALYST" -2025,"Oct",730,1904,"CATALYST" -2025,"Nov",815,2163,"CATALYST" -2025,"Dec",1161,3626,"CATALYST" -2025,"all",5787,26071,"CATALYST" -2025,"Jan",579,1093,"flowAI" -2025,"Feb",560,888,"flowAI" -2025,"Mar",607,1013,"flowAI" -2025,"Apr",641,1135,"flowAI" -2025,"May",620,1100,"flowAI" -2025,"Jun",563,908,"flowAI" -2025,"Jul",652,965,"flowAI" -2025,"Aug",541,832,"flowAI" -2025,"Sep",724,2413,"flowAI" -2025,"Oct",680,1424,"flowAI" -2025,"Nov",598,810,"flowAI" -2025,"Dec",851,1126,"flowAI" -2025,"all",6349,13707,"flowAI" -2025,"Jan",355,849,"diffcyt" -2025,"Feb",395,816,"diffcyt" -2025,"Mar",447,915,"diffcyt" -2025,"Apr",436,946,"diffcyt" -2025,"May",429,945,"diffcyt" -2025,"Jun",325,672,"diffcyt" -2025,"Jul",479,898,"diffcyt" -2025,"Aug",495,1235,"diffcyt" -2025,"Sep",602,4833,"diffcyt" -2025,"Oct",591,1507,"diffcyt" -2025,"Nov",601,1028,"diffcyt" -2025,"Dec",879,2275,"diffcyt" -2025,"all",4759,16919,"diffcyt" -2025,"Jan",302,614,"flowDensity" -2025,"Feb",332,531,"flowDensity" -2025,"Mar",331,531,"flowDensity" -2025,"Apr",401,689,"flowDensity" -2025,"May",432,761,"flowDensity" -2025,"Jun",403,593,"flowDensity" -2025,"Jul",435,606,"flowDensity" -2025,"Aug",395,770,"flowDensity" -2025,"Sep",558,2784,"flowDensity" -2025,"Oct",497,1248,"flowDensity" -2025,"Nov",386,565,"flowDensity" -2025,"Dec",913,3798,"flowDensity" -2025,"all",4151,13490,"flowDensity" -2025,"Jan",211,574,"flowMeans" -2025,"Feb",225,497,"flowMeans" -2025,"Mar",180,424,"flowMeans" -2025,"Apr",241,596,"flowMeans" -2025,"May",347,795,"flowMeans" -2025,"Jun",261,525,"flowMeans" -2025,"Jul",329,572,"flowMeans" -2025,"Aug",297,565,"flowMeans" -2025,"Sep",335,680,"flowMeans" -2025,"Oct",248,531,"flowMeans" -2025,"Nov",449,906,"flowMeans" -2025,"Dec",1327,2091,"flowMeans" -2025,"all",3483,8756,"flowMeans" -2025,"Jan",281,525,"PeacoQC" -2025,"Feb",303,457,"PeacoQC" -2025,"Mar",334,561,"PeacoQC" -2025,"Apr",366,640,"PeacoQC" -2025,"May",314,562,"PeacoQC" -2025,"Jun",283,434,"PeacoQC" -2025,"Jul",369,510,"PeacoQC" -2025,"Aug",278,419,"PeacoQC" -2025,"Sep",558,896,"PeacoQC" -2025,"Oct",416,659,"PeacoQC" -2025,"Nov",351,548,"PeacoQC" -2025,"Dec",712,993,"PeacoQC" -2025,"all",3858,7204,"PeacoQC" -2025,"Jan",240,464,"flowFP" -2025,"Feb",235,410,"flowFP" -2025,"Mar",185,358,"flowFP" -2025,"Apr",278,624,"flowFP" -2025,"May",298,637,"flowFP" -2025,"Jun",322,532,"flowFP" -2025,"Jul",321,473,"flowFP" -2025,"Aug",315,622,"flowFP" -2025,"Sep",348,664,"flowFP" -2025,"Oct",276,510,"flowFP" -2025,"Nov",314,453,"flowFP" -2025,"Dec",1256,1872,"flowFP" -2025,"all",3458,7619,"flowFP" -2025,"Jan",262,505,"flowClean" -2025,"Feb",297,482,"flowClean" -2025,"Mar",301,448,"flowClean" -2025,"Apr",333,609,"flowClean" -2025,"May",312,588,"flowClean" -2025,"Jun",316,496,"flowClean" -2025,"Jul",374,527,"flowClean" -2025,"Aug",324,527,"flowClean" -2025,"Sep",377,566,"flowClean" -2025,"Oct",339,548,"flowClean" -2025,"Nov",254,354,"flowClean" -2025,"Dec",636,790,"flowClean" -2025,"all",3472,6440,"flowClean" -2025,"Jan",259,485,"flowPeaks" -2025,"Feb",256,416,"flowPeaks" -2025,"Mar",234,484,"flowPeaks" -2025,"Apr",300,572,"flowPeaks" -2025,"May",341,692,"flowPeaks" -2025,"Jun",318,491,"flowPeaks" -2025,"Jul",397,577,"flowPeaks" -2025,"Aug",309,551,"flowPeaks" -2025,"Sep",373,659,"flowPeaks" -2025,"Oct",230,361,"flowPeaks" -2025,"Nov",265,406,"flowPeaks" -2025,"Dec",377,488,"flowPeaks" -2025,"all",2959,6182,"flowPeaks" -2025,"Jan",202,401,"COMPASS" -2025,"Feb",187,305,"COMPASS" -2025,"Mar",189,365,"COMPASS" -2025,"Apr",221,409,"COMPASS" -2025,"May",266,535,"COMPASS" -2025,"Jun",279,436,"COMPASS" -2025,"Jul",383,542,"COMPASS" -2025,"Aug",235,429,"COMPASS" -2025,"Sep",288,490,"COMPASS" -2025,"Oct",277,463,"COMPASS" -2025,"Nov",229,331,"COMPASS" -2025,"Dec",709,886,"COMPASS" -2025,"all",2988,5592,"COMPASS" -2025,"Jan",241,468,"SamSPECTRAL" -2025,"Feb",251,403,"SamSPECTRAL" -2025,"Mar",225,421,"SamSPECTRAL" -2025,"Apr",225,418,"SamSPECTRAL" -2025,"May",215,451,"SamSPECTRAL" -2025,"Jun",254,369,"SamSPECTRAL" -2025,"Jul",306,447,"SamSPECTRAL" -2025,"Aug",239,443,"SamSPECTRAL" -2025,"Sep",288,461,"SamSPECTRAL" -2025,"Oct",162,284,"SamSPECTRAL" -2025,"Nov",469,994,"SamSPECTRAL" -2025,"Dec",602,1312,"SamSPECTRAL" -2025,"all",2848,6471,"SamSPECTRAL" -2025,"Jan",176,428,"flowVS" -2025,"Feb",206,378,"flowVS" -2025,"Mar",205,361,"flowVS" -2025,"Apr",230,446,"flowVS" -2025,"May",265,543,"flowVS" -2025,"Jun",282,418,"flowVS" -2025,"Jul",313,435,"flowVS" -2025,"Aug",276,476,"flowVS" -2025,"Sep",260,421,"flowVS" -2025,"Oct",232,394,"flowVS" -2025,"Nov",192,304,"flowVS" -2025,"Dec",701,817,"flowVS" -2025,"all",2837,5421,"flowVS" -2025,"Jan",164,368,"cydar" -2025,"Feb",197,291,"cydar" -2025,"Mar",173,331,"cydar" -2025,"Apr",215,418,"cydar" -2025,"May",222,488,"cydar" -2025,"Jun",251,369,"cydar" -2025,"Jul",362,509,"cydar" -2025,"Aug",222,377,"cydar" -2025,"Sep",329,683,"cydar" -2025,"Oct",301,811,"cydar" -2025,"Nov",221,319,"cydar" -2025,"Dec",575,677,"cydar" -2025,"all",2764,5641,"cydar" -2025,"Jan",217,495,"flowMerge" -2025,"Feb",222,396,"flowMerge" -2025,"Mar",188,365,"flowMerge" -2025,"Apr",207,445,"flowMerge" -2025,"May",184,428,"flowMerge" -2025,"Jun",206,330,"flowMerge" -2025,"Jul",269,386,"flowMerge" -2025,"Aug",282,518,"flowMerge" -2025,"Sep",179,301,"flowMerge" -2025,"Oct",175,317,"flowMerge" -2025,"Nov",234,349,"flowMerge" -2025,"Dec",861,1060,"flowMerge" -2025,"all",2816,5390,"flowMerge" -2025,"Jan",223,499,"flowTrans" -2025,"Feb",223,392,"flowTrans" -2025,"Mar",178,338,"flowTrans" -2025,"Apr",204,432,"flowTrans" -2025,"May",166,386,"flowTrans" -2025,"Jun",164,268,"flowTrans" -2025,"Jul",239,357,"flowTrans" -2025,"Aug",300,582,"flowTrans" -2025,"Sep",357,1012,"flowTrans" -2025,"Oct",160,285,"flowTrans" -2025,"Nov",183,301,"flowTrans" -2025,"Dec",734,849,"flowTrans" -2025,"all",2844,5701,"flowTrans" -2025,"Jan",211,380,"distinct" -2025,"Feb",184,285,"distinct" -2025,"Mar",211,400,"distinct" -2025,"Apr",224,475,"distinct" -2025,"May",281,563,"distinct" -2025,"Jun",317,505,"distinct" -2025,"Jul",427,711,"distinct" -2025,"Aug",235,409,"distinct" -2025,"Sep",330,632,"distinct" -2025,"Oct",238,447,"distinct" -2025,"Nov",181,292,"distinct" -2025,"Dec",331,466,"distinct" -2025,"all",2746,5565,"distinct" -2025,"Jan",201,381,"flowCut" -2025,"Feb",198,320,"flowCut" -2025,"Mar",196,376,"flowCut" -2025,"Apr",227,431,"flowCut" -2025,"May",218,450,"flowCut" -2025,"Jun",240,368,"flowCut" -2025,"Jul",274,407,"flowCut" -2025,"Aug",187,299,"flowCut" -2025,"Sep",310,531,"flowCut" -2025,"Oct",250,404,"flowCut" -2025,"Nov",204,300,"flowCut" -2025,"Dec",357,425,"flowCut" -2025,"all",2485,4692,"flowCut" -2025,"Jan",202,456,"flowMatch" -2025,"Feb",183,323,"flowMatch" -2025,"Mar",158,297,"flowMatch" -2025,"Apr",215,462,"flowMatch" -2025,"May",240,516,"flowMatch" -2025,"Jun",211,377,"flowMatch" -2025,"Jul",302,457,"flowMatch" -2025,"Aug",197,352,"flowMatch" -2025,"Sep",160,275,"flowMatch" -2025,"Oct",134,251,"flowMatch" -2025,"Nov",166,269,"flowMatch" -2025,"Dec",640,725,"flowMatch" -2025,"all",2418,4760,"flowMatch" -2025,"Jan",181,379,"flowBeads" -2025,"Feb",178,327,"flowBeads" -2025,"Mar",161,317,"flowBeads" -2025,"Apr",193,408,"flowBeads" -2025,"May",200,438,"flowBeads" -2025,"Jun",192,298,"flowBeads" -2025,"Jul",259,374,"flowBeads" -2025,"Aug",196,340,"flowBeads" -2025,"Sep",190,311,"flowBeads" -2025,"Oct",151,300,"flowBeads" -2025,"Nov",175,278,"flowBeads" -2025,"Dec",770,891,"flowBeads" -2025,"all",2532,4661,"flowBeads" -2025,"Jan",168,371,"flowTime" -2025,"Feb",171,330,"flowTime" -2025,"Mar",159,354,"flowTime" -2025,"Apr",230,507,"flowTime" -2025,"May",237,503,"flowTime" -2025,"Jun",241,356,"flowTime" -2025,"Jul",328,472,"flowTime" -2025,"Aug",225,385,"flowTime" -2025,"Sep",180,309,"flowTime" -2025,"Oct",149,287,"flowTime" -2025,"Nov",178,294,"flowTime" -2025,"Dec",525,638,"flowTime" -2025,"all",2443,4806,"flowTime" -2025,"Jan",186,383,"sccomp" -2025,"Feb",197,335,"sccomp" -2025,"Mar",200,359,"sccomp" -2025,"Apr",222,435,"sccomp" -2025,"May",244,505,"sccomp" -2025,"Jun",219,384,"sccomp" -2025,"Jul",289,484,"sccomp" -2025,"Aug",216,373,"sccomp" -2025,"Sep",205,353,"sccomp" -2025,"Oct",188,338,"sccomp" -2025,"Nov",194,322,"sccomp" -2025,"Dec",284,398,"sccomp" -2025,"all",2293,4669,"sccomp" -2025,"Jan",175,403,"flowCHIC" -2025,"Feb",193,340,"flowCHIC" -2025,"Mar",166,326,"flowCHIC" -2025,"Apr",196,447,"flowCHIC" -2025,"May",237,504,"flowCHIC" -2025,"Jun",206,319,"flowCHIC" -2025,"Jul",258,373,"flowCHIC" -2025,"Aug",246,420,"flowCHIC" -2025,"Sep",175,278,"flowCHIC" -2025,"Oct",134,234,"flowCHIC" -2025,"Nov",163,283,"flowCHIC" -2025,"Dec",433,506,"flowCHIC" -2025,"all",2203,4433,"flowCHIC" -2025,"Jan",160,328,"flowSpecs" -2025,"Feb",145,243,"flowSpecs" -2025,"Mar",154,260,"flowSpecs" -2025,"Apr",204,399,"flowSpecs" -2025,"May",232,455,"flowSpecs" -2025,"Jun",202,323,"flowSpecs" -2025,"Jul",275,420,"flowSpecs" -2025,"Aug",195,311,"flowSpecs" -2025,"Sep",204,334,"flowSpecs" -2025,"Oct",137,254,"flowSpecs" -2025,"Nov",167,260,"flowSpecs" -2025,"Dec",431,531,"flowSpecs" -2025,"all",2208,4118,"flowSpecs" -2025,"Jan",162,480,"DepecheR" -2025,"Feb",158,379,"DepecheR" -2025,"Mar",171,370,"DepecheR" -2025,"Apr",231,594,"DepecheR" -2025,"May",263,598,"DepecheR" -2025,"Jun",237,479,"DepecheR" -2025,"Jul",304,534,"DepecheR" -2025,"Aug",196,313,"DepecheR" -2025,"Sep",187,296,"DepecheR" -2025,"Oct",155,270,"DepecheR" -2025,"Nov",154,269,"DepecheR" -2025,"Dec",330,402,"DepecheR" -2025,"all",2216,4984,"DepecheR" -2025,"Jan",144,319,"treekoR" -2025,"Feb",135,221,"treekoR" -2025,"Mar",174,294,"treekoR" -2025,"Apr",188,369,"treekoR" -2025,"May",251,477,"treekoR" -2025,"Jun",221,342,"treekoR" -2025,"Jul",326,480,"treekoR" -2025,"Aug",203,313,"treekoR" -2025,"Sep",177,301,"treekoR" -2025,"Oct",157,291,"treekoR" -2025,"Nov",187,343,"treekoR" -2025,"Dec",280,416,"treekoR" -2025,"all",2169,4166,"treekoR" -2025,"Jan",191,434,"flowBin" -2025,"Feb",188,332,"flowBin" -2025,"Mar",149,291,"flowBin" -2025,"Apr",140,315,"flowBin" -2025,"May",124,356,"flowBin" -2025,"Jun",132,231,"flowBin" -2025,"Jul",227,353,"flowBin" -2025,"Aug",200,344,"flowBin" -2025,"Sep",174,297,"flowBin" -2025,"Oct",188,338,"flowBin" -2025,"Nov",194,294,"flowBin" -2025,"Dec",490,566,"flowBin" -2025,"all",2226,4151,"flowBin" -2025,"Jan",167,380,"MetaCyto" -2025,"Feb",166,313,"MetaCyto" -2025,"Mar",167,316,"MetaCyto" -2025,"Apr",189,401,"MetaCyto" -2025,"May",212,427,"MetaCyto" -2025,"Jun",180,302,"MetaCyto" -2025,"Jul",273,393,"MetaCyto" -2025,"Aug",183,294,"MetaCyto" -2025,"Sep",280,479,"MetaCyto" -2025,"Oct",141,285,"MetaCyto" -2025,"Nov",146,279,"MetaCyto" -2025,"Dec",309,403,"MetaCyto" -2025,"all",2122,4272,"MetaCyto" -2025,"Jan",197,393,"immunoClust" -2025,"Feb",172,306,"immunoClust" -2025,"Mar",163,299,"immunoClust" -2025,"Apr",200,473,"immunoClust" -2025,"May",227,515,"immunoClust" -2025,"Jun",204,347,"immunoClust" -2025,"Jul",283,411,"immunoClust" -2025,"Aug",180,303,"immunoClust" -2025,"Sep",146,282,"immunoClust" -2025,"Oct",133,328,"immunoClust" -2025,"Nov",158,269,"immunoClust" -2025,"Dec",343,415,"immunoClust" -2025,"all",2042,4341,"immunoClust" -2025,"Jan",156,345,"scDataviz" -2025,"Feb",177,293,"scDataviz" -2025,"Mar",150,299,"scDataviz" -2025,"Apr",194,373,"scDataviz" -2025,"May",216,446,"scDataviz" -2025,"Jun",228,345,"scDataviz" -2025,"Jul",313,445,"scDataviz" -2025,"Aug",174,297,"scDataviz" -2025,"Sep",153,255,"scDataviz" -2025,"Oct",139,248,"scDataviz" -2025,"Nov",169,262,"scDataviz" -2025,"Dec",275,351,"scDataviz" -2025,"all",2061,3959,"scDataviz" -2025,"Jan",182,314,"cytoMEM" -2025,"Feb",158,272,"cytoMEM" -2025,"Mar",189,291,"cytoMEM" -2025,"Apr",229,435,"cytoMEM" -2025,"May",208,417,"cytoMEM" -2025,"Jun",208,324,"cytoMEM" -2025,"Jul",229,328,"cytoMEM" -2025,"Aug",170,278,"cytoMEM" -2025,"Sep",187,310,"cytoMEM" -2025,"Oct",193,380,"cytoMEM" -2025,"Nov",146,313,"cytoMEM" -2025,"Dec",175,268,"cytoMEM" -2025,"all",2036,3930,"cytoMEM" -2025,"Jan",182,313,"flowPloidy" -2025,"Feb",164,294,"flowPloidy" -2025,"Mar",146,245,"flowPloidy" -2025,"Apr",196,391,"flowPloidy" -2025,"May",215,450,"flowPloidy" -2025,"Jun",193,315,"flowPloidy" -2025,"Jul",246,364,"flowPloidy" -2025,"Aug",240,404,"flowPloidy" -2025,"Sep",166,261,"flowPloidy" -2025,"Oct",136,247,"flowPloidy" -2025,"Nov",140,234,"flowPloidy" -2025,"Dec",311,383,"flowPloidy" -2025,"all",2008,3901,"flowPloidy" -2025,"Jan",171,322,"plotGrouper" -2025,"Feb",142,257,"plotGrouper" -2025,"Mar",143,266,"plotGrouper" -2025,"Apr",136,272,"plotGrouper" -2025,"May",159,358,"plotGrouper" -2025,"Jun",131,236,"plotGrouper" -2025,"Jul",201,317,"plotGrouper" -2025,"Aug",173,289,"plotGrouper" -2025,"Sep",149,271,"plotGrouper" -2025,"Oct",127,255,"plotGrouper" -2025,"Nov",139,215,"plotGrouper" -2025,"Dec",426,502,"plotGrouper" -2025,"all",1976,3560,"plotGrouper" -2025,"Jan",206,563,"CytoDx" -2025,"Feb",180,363,"CytoDx" -2025,"Mar",169,311,"CytoDx" -2025,"Apr",159,379,"CytoDx" -2025,"May",149,385,"CytoDx" -2025,"Jun",128,231,"CytoDx" -2025,"Jul",223,343,"CytoDx" -2025,"Aug",205,330,"CytoDx" -2025,"Sep",196,321,"CytoDx" -2025,"Oct",164,315,"CytoDx" -2025,"Nov",167,288,"CytoDx" -2025,"Dec",217,316,"CytoDx" -2025,"all",1970,4145,"CytoDx" -2025,"Jan",175,391,"Sconify" -2025,"Feb",139,276,"Sconify" -2025,"Mar",162,310,"Sconify" -2025,"Apr",212,465,"Sconify" -2025,"May",215,457,"Sconify" -2025,"Jun",209,329,"Sconify" -2025,"Jul",262,371,"Sconify" -2025,"Aug",168,288,"Sconify" -2025,"Sep",173,292,"Sconify" -2025,"Oct",134,360,"Sconify" -2025,"Nov",131,252,"Sconify" -2025,"Dec",192,287,"Sconify" -2025,"all",1861,4078,"Sconify" -2025,"Jan",199,316,"flowPlots" -2025,"Feb",201,360,"flowPlots" -2025,"Mar",121,248,"flowPlots" -2025,"Apr",152,315,"flowPlots" -2025,"May",148,366,"flowPlots" -2025,"Jun",143,247,"flowPlots" -2025,"Jul",227,340,"flowPlots" -2025,"Aug",205,385,"flowPlots" -2025,"Sep",157,268,"flowPlots" -2025,"Oct",127,216,"flowPlots" -2025,"Nov",169,265,"flowPlots" -2025,"Dec",234,301,"flowPlots" -2025,"all",1935,3627,"flowPlots" -2025,"Jan",160,400,"GateFinder" -2025,"Feb",145,306,"GateFinder" -2025,"Mar",153,333,"GateFinder" -2025,"Apr",158,358,"GateFinder" -2025,"May",144,378,"GateFinder" -2025,"Jun",134,229,"GateFinder" -2025,"Jul",213,335,"GateFinder" -2025,"Aug",179,291,"GateFinder" -2025,"Sep",154,267,"GateFinder" -2025,"Oct",119,268,"GateFinder" -2025,"Nov",151,265,"GateFinder" -2025,"Dec",393,495,"GateFinder" -2025,"all",1945,3925,"GateFinder" -2025,"Jan",147,235,"flowGate" -2025,"Feb",134,214,"flowGate" -2025,"Mar",156,250,"flowGate" -2025,"Apr",197,356,"flowGate" -2025,"May",230,459,"flowGate" -2025,"Jun",165,271,"flowGate" -2025,"Jul",196,310,"flowGate" -2025,"Aug",163,262,"flowGate" -2025,"Sep",183,308,"flowGate" -2025,"Oct",142,257,"flowGate" -2025,"Nov",137,225,"flowGate" -2025,"Dec",190,261,"flowGate" -2025,"all",1851,3408,"flowGate" -2025,"Jan",153,313,"flowGraph" -2025,"Feb",115,222,"flowGraph" -2025,"Mar",144,260,"flowGraph" -2025,"Apr",193,391,"flowGraph" -2025,"May",238,488,"flowGraph" -2025,"Jun",171,307,"flowGraph" -2025,"Jul",245,372,"flowGraph" -2025,"Aug",154,254,"flowGraph" -2025,"Sep",161,284,"flowGraph" -2025,"Oct",136,234,"flowGraph" -2025,"Nov",137,234,"flowGraph" -2025,"Dec",202,286,"flowGraph" -2025,"all",1807,3645,"flowGraph" -2025,"Jan",188,388,"infinityFlow" -2025,"Feb",143,252,"infinityFlow" -2025,"Mar",148,261,"infinityFlow" -2025,"Apr",174,356,"infinityFlow" -2025,"May",202,441,"infinityFlow" -2025,"Jun",174,295,"infinityFlow" -2025,"Jul",212,315,"infinityFlow" -2025,"Aug",155,257,"infinityFlow" -2025,"Sep",166,271,"infinityFlow" -2025,"Oct",121,246,"infinityFlow" -2025,"Nov",129,221,"infinityFlow" -2025,"Dec",255,320,"infinityFlow" -2025,"all",1841,3623,"infinityFlow" -2025,"Jan",136,276,"cyanoFilter" -2025,"Feb",131,230,"cyanoFilter" -2025,"Mar",137,245,"cyanoFilter" -2025,"Apr",165,344,"cyanoFilter" -2025,"May",208,419,"cyanoFilter" -2025,"Jun",188,306,"cyanoFilter" -2025,"Jul",239,355,"cyanoFilter" -2025,"Aug",181,292,"cyanoFilter" -2025,"Sep",148,257,"cyanoFilter" -2025,"Oct",144,256,"cyanoFilter" -2025,"Nov",139,223,"cyanoFilter" -2025,"Dec",209,276,"cyanoFilter" -2025,"all",1745,3479,"cyanoFilter" -2025,"Jan",171,310,"optimalFlow" -2025,"Feb",132,230,"optimalFlow" -2025,"Mar",154,271,"optimalFlow" -2025,"Apr",174,347,"optimalFlow" -2025,"May",208,427,"optimalFlow" -2025,"Jun",162,284,"optimalFlow" -2025,"Jul",220,340,"optimalFlow" -2025,"Aug",167,260,"optimalFlow" -2025,"Sep",165,264,"optimalFlow" -2025,"Oct",131,247,"optimalFlow" -2025,"Nov",129,218,"optimalFlow" -2025,"Dec",244,305,"optimalFlow" -2025,"all",1858,3503,"optimalFlow" -2025,"Jan",161,298,"CytoGLMM" -2025,"Feb",140,252,"CytoGLMM" -2025,"Mar",153,264,"CytoGLMM" -2025,"Apr",134,289,"CytoGLMM" -2025,"May",152,359,"CytoGLMM" -2025,"Jun",159,255,"CytoGLMM" -2025,"Jul",246,353,"CytoGLMM" -2025,"Aug",166,336,"CytoGLMM" -2025,"Sep",156,266,"CytoGLMM" -2025,"Oct",169,275,"CytoGLMM" -2025,"Nov",130,221,"CytoGLMM" -2025,"Dec",261,336,"CytoGLMM" -2025,"all",1891,3504,"CytoGLMM" -2025,"Jan",146,284,"scifer" -2025,"Feb",134,215,"scifer" -2025,"Mar",129,261,"scifer" -2025,"Apr",154,353,"scifer" -2025,"May",173,394,"scifer" -2025,"Jun",191,306,"scifer" -2025,"Jul",216,338,"scifer" -2025,"Aug",156,275,"scifer" -2025,"Sep",149,260,"scifer" -2025,"Oct",120,240,"scifer" -2025,"Nov",122,199,"scifer" -2025,"Dec",332,414,"scifer" -2025,"all",1828,3539,"scifer" -2025,"Jan",167,323,"cytoKernel" -2025,"Feb",136,228,"cytoKernel" -2025,"Mar",146,253,"cytoKernel" -2025,"Apr",144,305,"cytoKernel" -2025,"May",185,389,"cytoKernel" -2025,"Jun",173,294,"cytoKernel" -2025,"Jul",241,365,"cytoKernel" -2025,"Aug",152,263,"cytoKernel" -2025,"Sep",154,255,"cytoKernel" -2025,"Oct",120,221,"cytoKernel" -2025,"Nov",159,239,"cytoKernel" -2025,"Dec",239,305,"cytoKernel" -2025,"all",1864,3440,"cytoKernel" -2025,"Jan",138,252,"CytoPipeline" -2025,"Feb",134,230,"CytoPipeline" -2025,"Mar",147,273,"CytoPipeline" -2025,"Apr",175,342,"CytoPipeline" -2025,"May",214,439,"CytoPipeline" -2025,"Jun",161,273,"CytoPipeline" -2025,"Jul",190,269,"CytoPipeline" -2025,"Aug",152,260,"CytoPipeline" -2025,"Sep",180,280,"CytoPipeline" -2025,"Oct",145,253,"CytoPipeline" -2025,"Nov",163,253,"CytoPipeline" -2025,"Dec",219,305,"CytoPipeline" -2025,"all",1846,3429,"CytoPipeline" -2025,"Jan",163,304,"censcyt" -2025,"Feb",136,226,"censcyt" -2025,"Mar",132,230,"censcyt" -2025,"Apr",121,298,"censcyt" -2025,"May",158,368,"censcyt" -2025,"Jun",116,222,"censcyt" -2025,"Jul",193,319,"censcyt" -2025,"Aug",165,273,"censcyt" -2025,"Sep",146,252,"censcyt" -2025,"Oct",117,222,"censcyt" -2025,"Nov",178,314,"censcyt" -2025,"Dec",263,382,"censcyt" -2025,"all",1771,3410,"censcyt" -2025,"Jan",177,304,"flowCyBar" -2025,"Feb",162,315,"flowCyBar" -2025,"Mar",122,245,"flowCyBar" -2025,"Apr",128,314,"flowCyBar" -2025,"May",137,380,"flowCyBar" -2025,"Jun",105,206,"flowCyBar" -2025,"Jul",256,375,"flowCyBar" -2025,"Aug",178,318,"flowCyBar" -2025,"Sep",161,261,"flowCyBar" -2025,"Oct",126,225,"flowCyBar" -2025,"Nov",168,267,"flowCyBar" -2025,"Dec",195,266,"flowCyBar" -2025,"all",1765,3476,"flowCyBar" -2025,"Jan",96,172,"reconsi" -2025,"Feb",147,254,"reconsi" -2025,"Mar",139,248,"reconsi" -2025,"Apr",121,286,"reconsi" -2025,"May",193,412,"reconsi" -2025,"Jun",150,244,"reconsi" -2025,"Jul",219,355,"reconsi" -2025,"Aug",168,286,"reconsi" -2025,"Sep",154,259,"reconsi" -2025,"Oct",132,240,"reconsi" -2025,"Nov",123,211,"reconsi" -2025,"Dec",190,260,"reconsi" -2025,"all",1705,3227,"reconsi" -2025,"Jan",151,266,"MACSQuantifyR" -2025,"Feb",120,221,"MACSQuantifyR" -2025,"Mar",111,223,"MACSQuantifyR" -2025,"Apr",169,331,"MACSQuantifyR" -2025,"May",193,387,"MACSQuantifyR" -2025,"Jun",164,281,"MACSQuantifyR" -2025,"Jul",210,319,"MACSQuantifyR" -2025,"Aug",170,295,"MACSQuantifyR" -2025,"Sep",146,246,"MACSQuantifyR" -2025,"Oct",129,243,"MACSQuantifyR" -2025,"Nov",128,209,"MACSQuantifyR" -2025,"Dec",125,190,"MACSQuantifyR" -2025,"all",1625,3211,"MACSQuantifyR" -2025,"Jan",141,222,"CytoMDS" -2025,"Feb",116,196,"CytoMDS" -2025,"Mar",107,194,"CytoMDS" -2025,"Apr",121,266,"CytoMDS" -2025,"May",152,347,"CytoMDS" -2025,"Jun",126,222,"CytoMDS" -2025,"Jul",180,263,"CytoMDS" -2025,"Aug",146,240,"CytoMDS" -2025,"Sep",126,208,"CytoMDS" -2025,"Oct",124,225,"CytoMDS" -2025,"Nov",112,188,"CytoMDS" -2025,"Dec",165,327,"CytoMDS" -2025,"all",1507,2898,"CytoMDS" -2025,"Jan",135,212,"CytoPipelineGUI" -2025,"Feb",112,188,"CytoPipelineGUI" -2025,"Mar",118,201,"CytoPipelineGUI" -2025,"Apr",132,278,"CytoPipelineGUI" -2025,"May",149,359,"CytoPipelineGUI" -2025,"Jun",131,225,"CytoPipelineGUI" -2025,"Jul",154,239,"CytoPipelineGUI" -2025,"Aug",127,228,"CytoPipelineGUI" -2025,"Sep",141,223,"CytoPipelineGUI" -2025,"Oct",122,225,"CytoPipelineGUI" -2025,"Nov",123,209,"CytoPipelineGUI" -2025,"Dec",142,207,"CytoPipelineGUI" -2025,"all",1471,2794,"CytoPipelineGUI" -2025,"Jan",126,204,"MAPFX" -2025,"Feb",114,188,"MAPFX" -2025,"Mar",112,199,"MAPFX" -2025,"Apr",123,247,"MAPFX" -2025,"May",136,293,"MAPFX" -2025,"Jun",129,223,"MAPFX" -2025,"Jul",172,255,"MAPFX" -2025,"Aug",182,273,"MAPFX" -2025,"Sep",117,206,"MAPFX" -2025,"Oct",116,204,"MAPFX" -2025,"Nov",106,184,"MAPFX" -2025,"Dec",157,234,"MAPFX" -2025,"all",1475,2710,"MAPFX" -2025,"Jan",145,229,"spillR" -2025,"Feb",111,184,"spillR" -2025,"Mar",103,194,"spillR" -2025,"Apr",118,236,"spillR" -2025,"May",156,316,"spillR" -2025,"Jun",138,248,"spillR" -2025,"Jul",126,221,"spillR" -2025,"Aug",147,245,"spillR" -2025,"Sep",123,218,"spillR" -2025,"Oct",122,209,"spillR" -2025,"Nov",97,176,"spillR" -2025,"Dec",153,213,"spillR" -2025,"all",1449,2689,"spillR" -2025,"Jan",129,207,"tidyFlowCore" -2025,"Feb",111,189,"tidyFlowCore" -2025,"Mar",111,196,"tidyFlowCore" -2025,"Apr",117,255,"tidyFlowCore" -2025,"May",115,306,"tidyFlowCore" -2025,"Jun",104,200,"tidyFlowCore" -2025,"Jul",139,228,"tidyFlowCore" -2025,"Aug",130,234,"tidyFlowCore" -2025,"Sep",124,224,"tidyFlowCore" -2025,"Oct",112,210,"tidyFlowCore" -2025,"Nov",110,190,"tidyFlowCore" -2025,"Dec",132,193,"tidyFlowCore" -2025,"all",1350,2632,"tidyFlowCore" -2025,"Jan",39,84,"CyTOFpower" -2025,"Feb",37,46,"CyTOFpower" -2025,"Mar",60,76,"CyTOFpower" -2025,"Apr",57,95,"CyTOFpower" -2025,"May",32,55,"CyTOFpower" -2025,"Jun",57,74,"CyTOFpower" -2025,"Jul",149,201,"CyTOFpower" -2025,"Aug",139,295,"CyTOFpower" -2025,"Sep",136,233,"CyTOFpower" -2025,"Oct",110,211,"CyTOFpower" -2025,"Nov",135,239,"CyTOFpower" -2025,"Dec",197,275,"CyTOFpower" -2025,"all",1085,1884,"CyTOFpower" -2025,"Jan",116,211,"tidytof" -2025,"Feb",103,173,"tidytof" -2025,"Mar",103,192,"tidytof" -2025,"Apr",112,248,"tidytof" -2025,"May",142,333,"tidytof" -2025,"Jun",150,261,"tidytof" -2025,"Jul",164,270,"tidytof" -2025,"Aug",137,237,"tidytof" -2025,"Sep",141,231,"tidytof" -2025,"Oct",61,91,"tidytof" -2025,"Nov",23,24,"tidytof" -2025,"Dec",33,34,"tidytof" -2025,"all",1198,2305,"tidytof" -2025,"Jan",0,0,"SuperCellCyto" -2025,"Feb",0,0,"SuperCellCyto" -2025,"Mar",0,0,"SuperCellCyto" -2025,"Apr",0,0,"SuperCellCyto" -2025,"May",0,0,"SuperCellCyto" -2025,"Jun",0,0,"SuperCellCyto" -2025,"Jul",0,0,"SuperCellCyto" -2025,"Aug",0,0,"SuperCellCyto" -2025,"Sep",0,0,"SuperCellCyto" -2025,"Oct",101,190,"SuperCellCyto" -2025,"Nov",115,195,"SuperCellCyto" -2025,"Dec",128,195,"SuperCellCyto" -2025,"all",336,580,"SuperCellCyto" +"Year","Month","Nb_of_distinct_IPs","Nb_of_downloads","package" +2025,"Jan",2233,4445,"flowCore" +2025,"Feb",2376,4254,"flowCore" +2025,"Mar",2691,5218,"flowCore" +2025,"Apr",2660,5098,"flowCore" +2025,"May",2643,5838,"flowCore" +2025,"Jun",2523,5070,"flowCore" +2025,"Jul",2887,5789,"flowCore" +2025,"Aug",2592,15192,"flowCore" +2025,"Sep",3039,38024,"flowCore" +2025,"Oct",2958,15956,"flowCore" +2025,"Nov",3645,10389,"flowCore" +2025,"Dec",3982,14260,"flowCore" +2025,"all",26720,129533,"flowCore" +2025,"Jan",2501,4902,"cytolib" +2025,"Feb",2588,4534,"cytolib" +2025,"Mar",2755,5463,"cytolib" +2025,"Apr",2741,4785,"cytolib" +2025,"May",2545,4725,"cytolib" +2025,"Jun",2325,3897,"cytolib" +2025,"Jul",2731,4705,"cytolib" +2025,"Aug",2358,14116,"cytolib" +2025,"Sep",2868,37708,"cytolib" +2025,"Oct",2867,15757,"cytolib" +2025,"Nov",3500,9793,"cytolib" +2025,"Dec",3167,12209,"cytolib" +2025,"all",25638,122594,"cytolib" +2025,"Jan",1006,2206,"flowWorkspace" +2025,"Feb",980,1802,"flowWorkspace" +2025,"Mar",1386,2734,"flowWorkspace" +2025,"Apr",1330,2614,"flowWorkspace" +2025,"May",1381,3229,"flowWorkspace" +2025,"Jun",1200,2420,"flowWorkspace" +2025,"Jul",1469,2894,"flowWorkspace" +2025,"Aug",1242,6409,"flowWorkspace" +2025,"Sep",1515,22768,"flowWorkspace" +2025,"Oct",1506,8677,"flowWorkspace" +2025,"Nov",1936,5480,"flowWorkspace" +2025,"Dec",2406,9893,"flowWorkspace" +2025,"all",13542,71126,"flowWorkspace" +2025,"Jan",1066,2080,"ncdfFlow" +2025,"Feb",1038,1758,"ncdfFlow" +2025,"Mar",1246,2295,"ncdfFlow" +2025,"Apr",1235,2103,"ncdfFlow" +2025,"May",1251,2417,"ncdfFlow" +2025,"Jun",1040,1635,"ncdfFlow" +2025,"Jul",1227,1962,"ncdfFlow" +2025,"Aug",1157,5939,"ncdfFlow" +2025,"Sep",1410,22562,"ncdfFlow" +2025,"Oct",1438,8643,"ncdfFlow" +2025,"Nov",1846,4987,"ncdfFlow" +2025,"Dec",2465,8821,"ncdfFlow" +2025,"all",12958,65202,"ncdfFlow" +2025,"Jan",869,1692,"flowViz" +2025,"Feb",851,1372,"flowViz" +2025,"Mar",1014,1763,"flowViz" +2025,"Apr",1000,1762,"flowViz" +2025,"May",1042,1879,"flowViz" +2025,"Jun",862,1338,"flowViz" +2025,"Jul",1023,1520,"flowViz" +2025,"Aug",1028,7336,"flowViz" +2025,"Sep",1192,23253,"flowViz" +2025,"Oct",1222,8503,"flowViz" +2025,"Nov",1529,4913,"flowViz" +2025,"Dec",2477,10579,"flowViz" +2025,"all",11266,65910,"flowViz" +2025,"Jan",1014,1814,"FlowSOM" +2025,"Feb",943,1553,"FlowSOM" +2025,"Mar",1029,1769,"FlowSOM" +2025,"Apr",1163,2102,"FlowSOM" +2025,"May",1074,2057,"FlowSOM" +2025,"Jun",995,1658,"FlowSOM" +2025,"Jul",1211,2098,"FlowSOM" +2025,"Aug",1056,4924,"FlowSOM" +2025,"Sep",1360,14884,"FlowSOM" +2025,"Oct",1281,5173,"FlowSOM" +2025,"Nov",1523,4312,"FlowSOM" +2025,"Dec",1841,7558,"FlowSOM" +2025,"all",11129,49902,"FlowSOM" +2025,"Jan",724,1521,"ggcyto" +2025,"Feb",712,1225,"ggcyto" +2025,"Mar",930,1603,"ggcyto" +2025,"Apr",1028,1838,"ggcyto" +2025,"May",1103,2232,"ggcyto" +2025,"Jun",849,1537,"ggcyto" +2025,"Jul",1026,1839,"ggcyto" +2025,"Aug",885,5193,"ggcyto" +2025,"Sep",1133,16596,"ggcyto" +2025,"Oct",1249,6653,"ggcyto" +2025,"Nov",1393,4083,"ggcyto" +2025,"Dec",1850,8319,"ggcyto" +2025,"all",10062,52639,"ggcyto" +2025,"Jan",592,1291,"openCyto" +2025,"Feb",582,1029,"openCyto" +2025,"Mar",711,1281,"openCyto" +2025,"Apr",720,1365,"openCyto" +2025,"May",745,1589,"openCyto" +2025,"Jun",675,1266,"openCyto" +2025,"Jul",798,1544,"openCyto" +2025,"Aug",759,4851,"openCyto" +2025,"Sep",989,19126,"openCyto" +2025,"Oct",953,5720,"openCyto" +2025,"Nov",1196,3753,"openCyto" +2025,"Dec",1916,8847,"openCyto" +2025,"all",8214,51662,"openCyto" +2025,"Jan",579,971,"quantiseqr" +2025,"Feb",633,957,"quantiseqr" +2025,"Mar",684,1052,"quantiseqr" +2025,"Apr",757,1131,"quantiseqr" +2025,"May",811,1260,"quantiseqr" +2025,"Jun",773,1188,"quantiseqr" +2025,"Jul",855,1349,"quantiseqr" +2025,"Aug",762,1025,"quantiseqr" +2025,"Sep",1111,1655,"quantiseqr" +2025,"Oct",917,1239,"quantiseqr" +2025,"Nov",1088,1474,"quantiseqr" +2025,"Dec",1057,1394,"quantiseqr" +2025,"all",8760,14695,"quantiseqr" +2025,"Jan",478,1039,"flowStats" +2025,"Feb",450,800,"flowStats" +2025,"Mar",450,884,"flowStats" +2025,"Apr",599,1173,"flowStats" +2025,"May",619,1325,"flowStats" +2025,"Jun",527,1014,"flowStats" +2025,"Jul",686,1230,"flowStats" +2025,"Aug",643,4856,"flowStats" +2025,"Sep",782,19103,"flowStats" +2025,"Oct",764,6182,"flowStats" +2025,"Nov",1134,3335,"flowStats" +2025,"Dec",1835,7470,"flowStats" +2025,"all",6792,48411,"flowStats" +2025,"Jan",458,1124,"CytoML" +2025,"Feb",424,859,"CytoML" +2025,"Mar",547,1169,"CytoML" +2025,"Apr",586,1135,"CytoML" +2025,"May",536,1150,"CytoML" +2025,"Jun",480,940,"CytoML" +2025,"Jul",627,1229,"CytoML" +2025,"Aug",575,4261,"CytoML" +2025,"Sep",720,14501,"CytoML" +2025,"Oct",738,4396,"CytoML" +2025,"Nov",852,2933,"CytoML" +2025,"Dec",1234,6871,"CytoML" +2025,"all",5688,40568,"CytoML" +2025,"Jan",467,1075,"CATALYST" +2025,"Feb",419,983,"CATALYST" +2025,"Mar",472,1075,"CATALYST" +2025,"Apr",530,1213,"CATALYST" +2025,"May",555,1284,"CATALYST" +2025,"Jun",534,1058,"CATALYST" +2025,"Jul",689,1307,"CATALYST" +2025,"Aug",552,2044,"CATALYST" +2025,"Sep",714,8339,"CATALYST" +2025,"Oct",730,1904,"CATALYST" +2025,"Nov",815,2163,"CATALYST" +2025,"Dec",1161,3626,"CATALYST" +2025,"all",5787,26071,"CATALYST" +2025,"Jan",579,1093,"flowAI" +2025,"Feb",560,888,"flowAI" +2025,"Mar",607,1013,"flowAI" +2025,"Apr",641,1135,"flowAI" +2025,"May",620,1100,"flowAI" +2025,"Jun",563,908,"flowAI" +2025,"Jul",652,965,"flowAI" +2025,"Aug",541,832,"flowAI" +2025,"Sep",724,2413,"flowAI" +2025,"Oct",680,1424,"flowAI" +2025,"Nov",598,810,"flowAI" +2025,"Dec",851,1126,"flowAI" +2025,"all",6349,13707,"flowAI" +2025,"Jan",355,849,"diffcyt" +2025,"Feb",395,816,"diffcyt" +2025,"Mar",447,915,"diffcyt" +2025,"Apr",436,946,"diffcyt" +2025,"May",429,945,"diffcyt" +2025,"Jun",325,672,"diffcyt" +2025,"Jul",479,898,"diffcyt" +2025,"Aug",495,1235,"diffcyt" +2025,"Sep",602,4833,"diffcyt" +2025,"Oct",591,1507,"diffcyt" +2025,"Nov",601,1028,"diffcyt" +2025,"Dec",879,2275,"diffcyt" +2025,"all",4759,16919,"diffcyt" +2025,"Jan",302,614,"flowDensity" +2025,"Feb",332,531,"flowDensity" +2025,"Mar",331,531,"flowDensity" +2025,"Apr",401,689,"flowDensity" +2025,"May",432,761,"flowDensity" +2025,"Jun",403,593,"flowDensity" +2025,"Jul",435,606,"flowDensity" +2025,"Aug",395,770,"flowDensity" +2025,"Sep",558,2784,"flowDensity" +2025,"Oct",497,1248,"flowDensity" +2025,"Nov",386,565,"flowDensity" +2025,"Dec",913,3798,"flowDensity" +2025,"all",4151,13490,"flowDensity" +2025,"Jan",211,574,"flowMeans" +2025,"Feb",225,497,"flowMeans" +2025,"Mar",180,424,"flowMeans" +2025,"Apr",241,596,"flowMeans" +2025,"May",347,795,"flowMeans" +2025,"Jun",261,525,"flowMeans" +2025,"Jul",329,572,"flowMeans" +2025,"Aug",297,565,"flowMeans" +2025,"Sep",335,680,"flowMeans" +2025,"Oct",248,531,"flowMeans" +2025,"Nov",449,906,"flowMeans" +2025,"Dec",1327,2091,"flowMeans" +2025,"all",3483,8756,"flowMeans" +2025,"Jan",281,525,"PeacoQC" +2025,"Feb",303,457,"PeacoQC" +2025,"Mar",334,561,"PeacoQC" +2025,"Apr",366,640,"PeacoQC" +2025,"May",314,562,"PeacoQC" +2025,"Jun",283,434,"PeacoQC" +2025,"Jul",369,510,"PeacoQC" +2025,"Aug",278,419,"PeacoQC" +2025,"Sep",558,896,"PeacoQC" +2025,"Oct",416,659,"PeacoQC" +2025,"Nov",351,548,"PeacoQC" +2025,"Dec",712,993,"PeacoQC" +2025,"all",3858,7204,"PeacoQC" +2025,"Jan",240,464,"flowFP" +2025,"Feb",235,410,"flowFP" +2025,"Mar",185,358,"flowFP" +2025,"Apr",278,624,"flowFP" +2025,"May",298,637,"flowFP" +2025,"Jun",322,532,"flowFP" +2025,"Jul",321,473,"flowFP" +2025,"Aug",315,622,"flowFP" +2025,"Sep",348,664,"flowFP" +2025,"Oct",276,510,"flowFP" +2025,"Nov",314,453,"flowFP" +2025,"Dec",1256,1872,"flowFP" +2025,"all",3458,7619,"flowFP" +2025,"Jan",262,505,"flowClean" +2025,"Feb",297,482,"flowClean" +2025,"Mar",301,448,"flowClean" +2025,"Apr",333,609,"flowClean" +2025,"May",312,588,"flowClean" +2025,"Jun",316,496,"flowClean" +2025,"Jul",374,527,"flowClean" +2025,"Aug",324,527,"flowClean" +2025,"Sep",377,566,"flowClean" +2025,"Oct",339,548,"flowClean" +2025,"Nov",254,354,"flowClean" +2025,"Dec",636,790,"flowClean" +2025,"all",3472,6440,"flowClean" +2025,"Jan",259,485,"flowPeaks" +2025,"Feb",256,416,"flowPeaks" +2025,"Mar",234,484,"flowPeaks" +2025,"Apr",300,572,"flowPeaks" +2025,"May",341,692,"flowPeaks" +2025,"Jun",318,491,"flowPeaks" +2025,"Jul",397,577,"flowPeaks" +2025,"Aug",309,551,"flowPeaks" +2025,"Sep",373,659,"flowPeaks" +2025,"Oct",230,361,"flowPeaks" +2025,"Nov",265,406,"flowPeaks" +2025,"Dec",377,488,"flowPeaks" +2025,"all",2959,6182,"flowPeaks" +2025,"Jan",202,401,"COMPASS" +2025,"Feb",187,305,"COMPASS" +2025,"Mar",189,365,"COMPASS" +2025,"Apr",221,409,"COMPASS" +2025,"May",266,535,"COMPASS" +2025,"Jun",279,436,"COMPASS" +2025,"Jul",383,542,"COMPASS" +2025,"Aug",235,429,"COMPASS" +2025,"Sep",288,490,"COMPASS" +2025,"Oct",277,463,"COMPASS" +2025,"Nov",229,331,"COMPASS" +2025,"Dec",709,886,"COMPASS" +2025,"all",2988,5592,"COMPASS" +2025,"Jan",241,468,"SamSPECTRAL" +2025,"Feb",251,403,"SamSPECTRAL" +2025,"Mar",225,421,"SamSPECTRAL" +2025,"Apr",225,418,"SamSPECTRAL" +2025,"May",215,451,"SamSPECTRAL" +2025,"Jun",254,369,"SamSPECTRAL" +2025,"Jul",306,447,"SamSPECTRAL" +2025,"Aug",239,443,"SamSPECTRAL" +2025,"Sep",288,461,"SamSPECTRAL" +2025,"Oct",162,284,"SamSPECTRAL" +2025,"Nov",469,994,"SamSPECTRAL" +2025,"Dec",602,1312,"SamSPECTRAL" +2025,"all",2848,6471,"SamSPECTRAL" +2025,"Jan",176,428,"flowVS" +2025,"Feb",206,378,"flowVS" +2025,"Mar",205,361,"flowVS" +2025,"Apr",230,446,"flowVS" +2025,"May",265,543,"flowVS" +2025,"Jun",282,418,"flowVS" +2025,"Jul",313,435,"flowVS" +2025,"Aug",276,476,"flowVS" +2025,"Sep",260,421,"flowVS" +2025,"Oct",232,394,"flowVS" +2025,"Nov",192,304,"flowVS" +2025,"Dec",701,817,"flowVS" +2025,"all",2837,5421,"flowVS" +2025,"Jan",164,368,"cydar" +2025,"Feb",197,291,"cydar" +2025,"Mar",173,331,"cydar" +2025,"Apr",215,418,"cydar" +2025,"May",222,488,"cydar" +2025,"Jun",251,369,"cydar" +2025,"Jul",362,509,"cydar" +2025,"Aug",222,377,"cydar" +2025,"Sep",329,683,"cydar" +2025,"Oct",301,811,"cydar" +2025,"Nov",221,319,"cydar" +2025,"Dec",575,677,"cydar" +2025,"all",2764,5641,"cydar" +2025,"Jan",217,495,"flowMerge" +2025,"Feb",222,396,"flowMerge" +2025,"Mar",188,365,"flowMerge" +2025,"Apr",207,445,"flowMerge" +2025,"May",184,428,"flowMerge" +2025,"Jun",206,330,"flowMerge" +2025,"Jul",269,386,"flowMerge" +2025,"Aug",282,518,"flowMerge" +2025,"Sep",179,301,"flowMerge" +2025,"Oct",175,317,"flowMerge" +2025,"Nov",234,349,"flowMerge" +2025,"Dec",861,1060,"flowMerge" +2025,"all",2816,5390,"flowMerge" +2025,"Jan",223,499,"flowTrans" +2025,"Feb",223,392,"flowTrans" +2025,"Mar",178,338,"flowTrans" +2025,"Apr",204,432,"flowTrans" +2025,"May",166,386,"flowTrans" +2025,"Jun",164,268,"flowTrans" +2025,"Jul",239,357,"flowTrans" +2025,"Aug",300,582,"flowTrans" +2025,"Sep",357,1012,"flowTrans" +2025,"Oct",160,285,"flowTrans" +2025,"Nov",183,301,"flowTrans" +2025,"Dec",734,849,"flowTrans" +2025,"all",2844,5701,"flowTrans" +2025,"Jan",211,380,"distinct" +2025,"Feb",184,285,"distinct" +2025,"Mar",211,400,"distinct" +2025,"Apr",224,475,"distinct" +2025,"May",281,563,"distinct" +2025,"Jun",317,505,"distinct" +2025,"Jul",427,711,"distinct" +2025,"Aug",235,409,"distinct" +2025,"Sep",330,632,"distinct" +2025,"Oct",238,447,"distinct" +2025,"Nov",181,292,"distinct" +2025,"Dec",331,466,"distinct" +2025,"all",2746,5565,"distinct" +2025,"Jan",201,381,"flowCut" +2025,"Feb",198,320,"flowCut" +2025,"Mar",196,376,"flowCut" +2025,"Apr",227,431,"flowCut" +2025,"May",218,450,"flowCut" +2025,"Jun",240,368,"flowCut" +2025,"Jul",274,407,"flowCut" +2025,"Aug",187,299,"flowCut" +2025,"Sep",310,531,"flowCut" +2025,"Oct",250,404,"flowCut" +2025,"Nov",204,300,"flowCut" +2025,"Dec",357,425,"flowCut" +2025,"all",2485,4692,"flowCut" +2025,"Jan",202,456,"flowMatch" +2025,"Feb",183,323,"flowMatch" +2025,"Mar",158,297,"flowMatch" +2025,"Apr",215,462,"flowMatch" +2025,"May",240,516,"flowMatch" +2025,"Jun",211,377,"flowMatch" +2025,"Jul",302,457,"flowMatch" +2025,"Aug",197,352,"flowMatch" +2025,"Sep",160,275,"flowMatch" +2025,"Oct",134,251,"flowMatch" +2025,"Nov",166,269,"flowMatch" +2025,"Dec",640,725,"flowMatch" +2025,"all",2418,4760,"flowMatch" +2025,"Jan",181,379,"flowBeads" +2025,"Feb",178,327,"flowBeads" +2025,"Mar",161,317,"flowBeads" +2025,"Apr",193,408,"flowBeads" +2025,"May",200,438,"flowBeads" +2025,"Jun",192,298,"flowBeads" +2025,"Jul",259,374,"flowBeads" +2025,"Aug",196,340,"flowBeads" +2025,"Sep",190,311,"flowBeads" +2025,"Oct",151,300,"flowBeads" +2025,"Nov",175,278,"flowBeads" +2025,"Dec",770,891,"flowBeads" +2025,"all",2532,4661,"flowBeads" +2025,"Jan",168,371,"flowTime" +2025,"Feb",171,330,"flowTime" +2025,"Mar",159,354,"flowTime" +2025,"Apr",230,507,"flowTime" +2025,"May",237,503,"flowTime" +2025,"Jun",241,356,"flowTime" +2025,"Jul",328,472,"flowTime" +2025,"Aug",225,385,"flowTime" +2025,"Sep",180,309,"flowTime" +2025,"Oct",149,287,"flowTime" +2025,"Nov",178,294,"flowTime" +2025,"Dec",525,638,"flowTime" +2025,"all",2443,4806,"flowTime" +2025,"Jan",186,383,"sccomp" +2025,"Feb",197,335,"sccomp" +2025,"Mar",200,359,"sccomp" +2025,"Apr",222,435,"sccomp" +2025,"May",244,505,"sccomp" +2025,"Jun",219,384,"sccomp" +2025,"Jul",289,484,"sccomp" +2025,"Aug",216,373,"sccomp" +2025,"Sep",205,353,"sccomp" +2025,"Oct",188,338,"sccomp" +2025,"Nov",194,322,"sccomp" +2025,"Dec",284,398,"sccomp" +2025,"all",2293,4669,"sccomp" +2025,"Jan",175,403,"flowCHIC" +2025,"Feb",193,340,"flowCHIC" +2025,"Mar",166,326,"flowCHIC" +2025,"Apr",196,447,"flowCHIC" +2025,"May",237,504,"flowCHIC" +2025,"Jun",206,319,"flowCHIC" +2025,"Jul",258,373,"flowCHIC" +2025,"Aug",246,420,"flowCHIC" +2025,"Sep",175,278,"flowCHIC" +2025,"Oct",134,234,"flowCHIC" +2025,"Nov",163,283,"flowCHIC" +2025,"Dec",433,506,"flowCHIC" +2025,"all",2203,4433,"flowCHIC" +2025,"Jan",160,328,"flowSpecs" +2025,"Feb",145,243,"flowSpecs" +2025,"Mar",154,260,"flowSpecs" +2025,"Apr",204,399,"flowSpecs" +2025,"May",232,455,"flowSpecs" +2025,"Jun",202,323,"flowSpecs" +2025,"Jul",275,420,"flowSpecs" +2025,"Aug",195,311,"flowSpecs" +2025,"Sep",204,334,"flowSpecs" +2025,"Oct",137,254,"flowSpecs" +2025,"Nov",167,260,"flowSpecs" +2025,"Dec",431,531,"flowSpecs" +2025,"all",2208,4118,"flowSpecs" +2025,"Jan",162,480,"DepecheR" +2025,"Feb",158,379,"DepecheR" +2025,"Mar",171,370,"DepecheR" +2025,"Apr",231,594,"DepecheR" +2025,"May",263,598,"DepecheR" +2025,"Jun",237,479,"DepecheR" +2025,"Jul",304,534,"DepecheR" +2025,"Aug",196,313,"DepecheR" +2025,"Sep",187,296,"DepecheR" +2025,"Oct",155,270,"DepecheR" +2025,"Nov",154,269,"DepecheR" +2025,"Dec",330,402,"DepecheR" +2025,"all",2216,4984,"DepecheR" +2025,"Jan",144,319,"treekoR" +2025,"Feb",135,221,"treekoR" +2025,"Mar",174,294,"treekoR" +2025,"Apr",188,369,"treekoR" +2025,"May",251,477,"treekoR" +2025,"Jun",221,342,"treekoR" +2025,"Jul",326,480,"treekoR" +2025,"Aug",203,313,"treekoR" +2025,"Sep",177,301,"treekoR" +2025,"Oct",157,291,"treekoR" +2025,"Nov",187,343,"treekoR" +2025,"Dec",280,416,"treekoR" +2025,"all",2169,4166,"treekoR" +2025,"Jan",191,434,"flowBin" +2025,"Feb",188,332,"flowBin" +2025,"Mar",149,291,"flowBin" +2025,"Apr",140,315,"flowBin" +2025,"May",124,356,"flowBin" +2025,"Jun",132,231,"flowBin" +2025,"Jul",227,353,"flowBin" +2025,"Aug",200,344,"flowBin" +2025,"Sep",174,297,"flowBin" +2025,"Oct",188,338,"flowBin" +2025,"Nov",194,294,"flowBin" +2025,"Dec",490,566,"flowBin" +2025,"all",2226,4151,"flowBin" +2025,"Jan",167,380,"MetaCyto" +2025,"Feb",166,313,"MetaCyto" +2025,"Mar",167,316,"MetaCyto" +2025,"Apr",189,401,"MetaCyto" +2025,"May",212,427,"MetaCyto" +2025,"Jun",180,302,"MetaCyto" +2025,"Jul",273,393,"MetaCyto" +2025,"Aug",183,294,"MetaCyto" +2025,"Sep",280,479,"MetaCyto" +2025,"Oct",141,285,"MetaCyto" +2025,"Nov",146,279,"MetaCyto" +2025,"Dec",309,403,"MetaCyto" +2025,"all",2122,4272,"MetaCyto" +2025,"Jan",197,393,"immunoClust" +2025,"Feb",172,306,"immunoClust" +2025,"Mar",163,299,"immunoClust" +2025,"Apr",200,473,"immunoClust" +2025,"May",227,515,"immunoClust" +2025,"Jun",204,347,"immunoClust" +2025,"Jul",283,411,"immunoClust" +2025,"Aug",180,303,"immunoClust" +2025,"Sep",146,282,"immunoClust" +2025,"Oct",133,328,"immunoClust" +2025,"Nov",158,269,"immunoClust" +2025,"Dec",343,415,"immunoClust" +2025,"all",2042,4341,"immunoClust" +2025,"Jan",156,345,"scDataviz" +2025,"Feb",177,293,"scDataviz" +2025,"Mar",150,299,"scDataviz" +2025,"Apr",194,373,"scDataviz" +2025,"May",216,446,"scDataviz" +2025,"Jun",228,345,"scDataviz" +2025,"Jul",313,445,"scDataviz" +2025,"Aug",174,297,"scDataviz" +2025,"Sep",153,255,"scDataviz" +2025,"Oct",139,248,"scDataviz" +2025,"Nov",169,262,"scDataviz" +2025,"Dec",275,351,"scDataviz" +2025,"all",2061,3959,"scDataviz" +2025,"Jan",182,314,"cytoMEM" +2025,"Feb",158,272,"cytoMEM" +2025,"Mar",189,291,"cytoMEM" +2025,"Apr",229,435,"cytoMEM" +2025,"May",208,417,"cytoMEM" +2025,"Jun",208,324,"cytoMEM" +2025,"Jul",229,328,"cytoMEM" +2025,"Aug",170,278,"cytoMEM" +2025,"Sep",187,310,"cytoMEM" +2025,"Oct",193,380,"cytoMEM" +2025,"Nov",146,313,"cytoMEM" +2025,"Dec",175,268,"cytoMEM" +2025,"all",2036,3930,"cytoMEM" +2025,"Jan",182,313,"flowPloidy" +2025,"Feb",164,294,"flowPloidy" +2025,"Mar",146,245,"flowPloidy" +2025,"Apr",196,391,"flowPloidy" +2025,"May",215,450,"flowPloidy" +2025,"Jun",193,315,"flowPloidy" +2025,"Jul",246,364,"flowPloidy" +2025,"Aug",240,404,"flowPloidy" +2025,"Sep",166,261,"flowPloidy" +2025,"Oct",136,247,"flowPloidy" +2025,"Nov",140,234,"flowPloidy" +2025,"Dec",311,383,"flowPloidy" +2025,"all",2008,3901,"flowPloidy" +2025,"Jan",171,322,"plotGrouper" +2025,"Feb",142,257,"plotGrouper" +2025,"Mar",143,266,"plotGrouper" +2025,"Apr",136,272,"plotGrouper" +2025,"May",159,358,"plotGrouper" +2025,"Jun",131,236,"plotGrouper" +2025,"Jul",201,317,"plotGrouper" +2025,"Aug",173,289,"plotGrouper" +2025,"Sep",149,271,"plotGrouper" +2025,"Oct",127,255,"plotGrouper" +2025,"Nov",139,215,"plotGrouper" +2025,"Dec",426,502,"plotGrouper" +2025,"all",1976,3560,"plotGrouper" +2025,"Jan",206,563,"CytoDx" +2025,"Feb",180,363,"CytoDx" +2025,"Mar",169,311,"CytoDx" +2025,"Apr",159,379,"CytoDx" +2025,"May",149,385,"CytoDx" +2025,"Jun",128,231,"CytoDx" +2025,"Jul",223,343,"CytoDx" +2025,"Aug",205,330,"CytoDx" +2025,"Sep",196,321,"CytoDx" +2025,"Oct",164,315,"CytoDx" +2025,"Nov",167,288,"CytoDx" +2025,"Dec",217,316,"CytoDx" +2025,"all",1970,4145,"CytoDx" +2025,"Jan",175,391,"Sconify" +2025,"Feb",139,276,"Sconify" +2025,"Mar",162,310,"Sconify" +2025,"Apr",212,465,"Sconify" +2025,"May",215,457,"Sconify" +2025,"Jun",209,329,"Sconify" +2025,"Jul",262,371,"Sconify" +2025,"Aug",168,288,"Sconify" +2025,"Sep",173,292,"Sconify" +2025,"Oct",134,360,"Sconify" +2025,"Nov",131,252,"Sconify" +2025,"Dec",192,287,"Sconify" +2025,"all",1861,4078,"Sconify" +2025,"Jan",199,316,"flowPlots" +2025,"Feb",201,360,"flowPlots" +2025,"Mar",121,248,"flowPlots" +2025,"Apr",152,315,"flowPlots" +2025,"May",148,366,"flowPlots" +2025,"Jun",143,247,"flowPlots" +2025,"Jul",227,340,"flowPlots" +2025,"Aug",205,385,"flowPlots" +2025,"Sep",157,268,"flowPlots" +2025,"Oct",127,216,"flowPlots" +2025,"Nov",169,265,"flowPlots" +2025,"Dec",234,301,"flowPlots" +2025,"all",1935,3627,"flowPlots" +2025,"Jan",160,400,"GateFinder" +2025,"Feb",145,306,"GateFinder" +2025,"Mar",153,333,"GateFinder" +2025,"Apr",158,358,"GateFinder" +2025,"May",144,378,"GateFinder" +2025,"Jun",134,229,"GateFinder" +2025,"Jul",213,335,"GateFinder" +2025,"Aug",179,291,"GateFinder" +2025,"Sep",154,267,"GateFinder" +2025,"Oct",119,268,"GateFinder" +2025,"Nov",151,265,"GateFinder" +2025,"Dec",393,495,"GateFinder" +2025,"all",1945,3925,"GateFinder" +2025,"Jan",147,235,"flowGate" +2025,"Feb",134,214,"flowGate" +2025,"Mar",156,250,"flowGate" +2025,"Apr",197,356,"flowGate" +2025,"May",230,459,"flowGate" +2025,"Jun",165,271,"flowGate" +2025,"Jul",196,310,"flowGate" +2025,"Aug",163,262,"flowGate" +2025,"Sep",183,308,"flowGate" +2025,"Oct",142,257,"flowGate" +2025,"Nov",137,225,"flowGate" +2025,"Dec",190,261,"flowGate" +2025,"all",1851,3408,"flowGate" +2025,"Jan",153,313,"flowGraph" +2025,"Feb",115,222,"flowGraph" +2025,"Mar",144,260,"flowGraph" +2025,"Apr",193,391,"flowGraph" +2025,"May",238,488,"flowGraph" +2025,"Jun",171,307,"flowGraph" +2025,"Jul",245,372,"flowGraph" +2025,"Aug",154,254,"flowGraph" +2025,"Sep",161,284,"flowGraph" +2025,"Oct",136,234,"flowGraph" +2025,"Nov",137,234,"flowGraph" +2025,"Dec",202,286,"flowGraph" +2025,"all",1807,3645,"flowGraph" +2025,"Jan",188,388,"infinityFlow" +2025,"Feb",143,252,"infinityFlow" +2025,"Mar",148,261,"infinityFlow" +2025,"Apr",174,356,"infinityFlow" +2025,"May",202,441,"infinityFlow" +2025,"Jun",174,295,"infinityFlow" +2025,"Jul",212,315,"infinityFlow" +2025,"Aug",155,257,"infinityFlow" +2025,"Sep",166,271,"infinityFlow" +2025,"Oct",121,246,"infinityFlow" +2025,"Nov",129,221,"infinityFlow" +2025,"Dec",255,320,"infinityFlow" +2025,"all",1841,3623,"infinityFlow" +2025,"Jan",136,276,"cyanoFilter" +2025,"Feb",131,230,"cyanoFilter" +2025,"Mar",137,245,"cyanoFilter" +2025,"Apr",165,344,"cyanoFilter" +2025,"May",208,419,"cyanoFilter" +2025,"Jun",188,306,"cyanoFilter" +2025,"Jul",239,355,"cyanoFilter" +2025,"Aug",181,292,"cyanoFilter" +2025,"Sep",148,257,"cyanoFilter" +2025,"Oct",144,256,"cyanoFilter" +2025,"Nov",139,223,"cyanoFilter" +2025,"Dec",209,276,"cyanoFilter" +2025,"all",1745,3479,"cyanoFilter" +2025,"Jan",171,310,"optimalFlow" +2025,"Feb",132,230,"optimalFlow" +2025,"Mar",154,271,"optimalFlow" +2025,"Apr",174,347,"optimalFlow" +2025,"May",208,427,"optimalFlow" +2025,"Jun",162,284,"optimalFlow" +2025,"Jul",220,340,"optimalFlow" +2025,"Aug",167,260,"optimalFlow" +2025,"Sep",165,264,"optimalFlow" +2025,"Oct",131,247,"optimalFlow" +2025,"Nov",129,218,"optimalFlow" +2025,"Dec",244,305,"optimalFlow" +2025,"all",1858,3503,"optimalFlow" +2025,"Jan",161,298,"CytoGLMM" +2025,"Feb",140,252,"CytoGLMM" +2025,"Mar",153,264,"CytoGLMM" +2025,"Apr",134,289,"CytoGLMM" +2025,"May",152,359,"CytoGLMM" +2025,"Jun",159,255,"CytoGLMM" +2025,"Jul",246,353,"CytoGLMM" +2025,"Aug",166,336,"CytoGLMM" +2025,"Sep",156,266,"CytoGLMM" +2025,"Oct",169,275,"CytoGLMM" +2025,"Nov",130,221,"CytoGLMM" +2025,"Dec",261,336,"CytoGLMM" +2025,"all",1891,3504,"CytoGLMM" +2025,"Jan",146,284,"scifer" +2025,"Feb",134,215,"scifer" +2025,"Mar",129,261,"scifer" +2025,"Apr",154,353,"scifer" +2025,"May",173,394,"scifer" +2025,"Jun",191,306,"scifer" +2025,"Jul",216,338,"scifer" +2025,"Aug",156,275,"scifer" +2025,"Sep",149,260,"scifer" +2025,"Oct",120,240,"scifer" +2025,"Nov",122,199,"scifer" +2025,"Dec",332,414,"scifer" +2025,"all",1828,3539,"scifer" +2025,"Jan",167,323,"cytoKernel" +2025,"Feb",136,228,"cytoKernel" +2025,"Mar",146,253,"cytoKernel" +2025,"Apr",144,305,"cytoKernel" +2025,"May",185,389,"cytoKernel" +2025,"Jun",173,294,"cytoKernel" +2025,"Jul",241,365,"cytoKernel" +2025,"Aug",152,263,"cytoKernel" +2025,"Sep",154,255,"cytoKernel" +2025,"Oct",120,221,"cytoKernel" +2025,"Nov",159,239,"cytoKernel" +2025,"Dec",239,305,"cytoKernel" +2025,"all",1864,3440,"cytoKernel" +2025,"Jan",138,252,"CytoPipeline" +2025,"Feb",134,230,"CytoPipeline" +2025,"Mar",147,273,"CytoPipeline" +2025,"Apr",175,342,"CytoPipeline" +2025,"May",214,439,"CytoPipeline" +2025,"Jun",161,273,"CytoPipeline" +2025,"Jul",190,269,"CytoPipeline" +2025,"Aug",152,260,"CytoPipeline" +2025,"Sep",180,280,"CytoPipeline" +2025,"Oct",145,253,"CytoPipeline" +2025,"Nov",163,253,"CytoPipeline" +2025,"Dec",219,305,"CytoPipeline" +2025,"all",1846,3429,"CytoPipeline" +2025,"Jan",163,304,"censcyt" +2025,"Feb",136,226,"censcyt" +2025,"Mar",132,230,"censcyt" +2025,"Apr",121,298,"censcyt" +2025,"May",158,368,"censcyt" +2025,"Jun",116,222,"censcyt" +2025,"Jul",193,319,"censcyt" +2025,"Aug",165,273,"censcyt" +2025,"Sep",146,252,"censcyt" +2025,"Oct",117,222,"censcyt" +2025,"Nov",178,314,"censcyt" +2025,"Dec",263,382,"censcyt" +2025,"all",1771,3410,"censcyt" +2025,"Jan",177,304,"flowCyBar" +2025,"Feb",162,315,"flowCyBar" +2025,"Mar",122,245,"flowCyBar" +2025,"Apr",128,314,"flowCyBar" +2025,"May",137,380,"flowCyBar" +2025,"Jun",105,206,"flowCyBar" +2025,"Jul",256,375,"flowCyBar" +2025,"Aug",178,318,"flowCyBar" +2025,"Sep",161,261,"flowCyBar" +2025,"Oct",126,225,"flowCyBar" +2025,"Nov",168,267,"flowCyBar" +2025,"Dec",195,266,"flowCyBar" +2025,"all",1765,3476,"flowCyBar" +2025,"Jan",96,172,"reconsi" +2025,"Feb",147,254,"reconsi" +2025,"Mar",139,248,"reconsi" +2025,"Apr",121,286,"reconsi" +2025,"May",193,412,"reconsi" +2025,"Jun",150,244,"reconsi" +2025,"Jul",219,355,"reconsi" +2025,"Aug",168,286,"reconsi" +2025,"Sep",154,259,"reconsi" +2025,"Oct",132,240,"reconsi" +2025,"Nov",123,211,"reconsi" +2025,"Dec",190,260,"reconsi" +2025,"all",1705,3227,"reconsi" +2025,"Jan",151,266,"MACSQuantifyR" +2025,"Feb",120,221,"MACSQuantifyR" +2025,"Mar",111,223,"MACSQuantifyR" +2025,"Apr",169,331,"MACSQuantifyR" +2025,"May",193,387,"MACSQuantifyR" +2025,"Jun",164,281,"MACSQuantifyR" +2025,"Jul",210,319,"MACSQuantifyR" +2025,"Aug",170,295,"MACSQuantifyR" +2025,"Sep",146,246,"MACSQuantifyR" +2025,"Oct",129,243,"MACSQuantifyR" +2025,"Nov",128,209,"MACSQuantifyR" +2025,"Dec",125,190,"MACSQuantifyR" +2025,"all",1625,3211,"MACSQuantifyR" +2025,"Jan",141,222,"CytoMDS" +2025,"Feb",116,196,"CytoMDS" +2025,"Mar",107,194,"CytoMDS" +2025,"Apr",121,266,"CytoMDS" +2025,"May",152,347,"CytoMDS" +2025,"Jun",126,222,"CytoMDS" +2025,"Jul",180,263,"CytoMDS" +2025,"Aug",146,240,"CytoMDS" +2025,"Sep",126,208,"CytoMDS" +2025,"Oct",124,225,"CytoMDS" +2025,"Nov",112,188,"CytoMDS" +2025,"Dec",165,327,"CytoMDS" +2025,"all",1507,2898,"CytoMDS" +2025,"Jan",135,212,"CytoPipelineGUI" +2025,"Feb",112,188,"CytoPipelineGUI" +2025,"Mar",118,201,"CytoPipelineGUI" +2025,"Apr",132,278,"CytoPipelineGUI" +2025,"May",149,359,"CytoPipelineGUI" +2025,"Jun",131,225,"CytoPipelineGUI" +2025,"Jul",154,239,"CytoPipelineGUI" +2025,"Aug",127,228,"CytoPipelineGUI" +2025,"Sep",141,223,"CytoPipelineGUI" +2025,"Oct",122,225,"CytoPipelineGUI" +2025,"Nov",123,209,"CytoPipelineGUI" +2025,"Dec",142,207,"CytoPipelineGUI" +2025,"all",1471,2794,"CytoPipelineGUI" +2025,"Jan",126,204,"MAPFX" +2025,"Feb",114,188,"MAPFX" +2025,"Mar",112,199,"MAPFX" +2025,"Apr",123,247,"MAPFX" +2025,"May",136,293,"MAPFX" +2025,"Jun",129,223,"MAPFX" +2025,"Jul",172,255,"MAPFX" +2025,"Aug",182,273,"MAPFX" +2025,"Sep",117,206,"MAPFX" +2025,"Oct",116,204,"MAPFX" +2025,"Nov",106,184,"MAPFX" +2025,"Dec",157,234,"MAPFX" +2025,"all",1475,2710,"MAPFX" +2025,"Jan",145,229,"spillR" +2025,"Feb",111,184,"spillR" +2025,"Mar",103,194,"spillR" +2025,"Apr",118,236,"spillR" +2025,"May",156,316,"spillR" +2025,"Jun",138,248,"spillR" +2025,"Jul",126,221,"spillR" +2025,"Aug",147,245,"spillR" +2025,"Sep",123,218,"spillR" +2025,"Oct",122,209,"spillR" +2025,"Nov",97,176,"spillR" +2025,"Dec",153,213,"spillR" +2025,"all",1449,2689,"spillR" +2025,"Jan",129,207,"tidyFlowCore" +2025,"Feb",111,189,"tidyFlowCore" +2025,"Mar",111,196,"tidyFlowCore" +2025,"Apr",117,255,"tidyFlowCore" +2025,"May",115,306,"tidyFlowCore" +2025,"Jun",104,200,"tidyFlowCore" +2025,"Jul",139,228,"tidyFlowCore" +2025,"Aug",130,234,"tidyFlowCore" +2025,"Sep",124,224,"tidyFlowCore" +2025,"Oct",112,210,"tidyFlowCore" +2025,"Nov",110,190,"tidyFlowCore" +2025,"Dec",132,193,"tidyFlowCore" +2025,"all",1350,2632,"tidyFlowCore" +2025,"Jan",39,84,"CyTOFpower" +2025,"Feb",37,46,"CyTOFpower" +2025,"Mar",60,76,"CyTOFpower" +2025,"Apr",57,95,"CyTOFpower" +2025,"May",32,55,"CyTOFpower" +2025,"Jun",57,74,"CyTOFpower" +2025,"Jul",149,201,"CyTOFpower" +2025,"Aug",139,295,"CyTOFpower" +2025,"Sep",136,233,"CyTOFpower" +2025,"Oct",110,211,"CyTOFpower" +2025,"Nov",135,239,"CyTOFpower" +2025,"Dec",197,275,"CyTOFpower" +2025,"all",1085,1884,"CyTOFpower" +2025,"Jan",116,211,"tidytof" +2025,"Feb",103,173,"tidytof" +2025,"Mar",103,192,"tidytof" +2025,"Apr",112,248,"tidytof" +2025,"May",142,333,"tidytof" +2025,"Jun",150,261,"tidytof" +2025,"Jul",164,270,"tidytof" +2025,"Aug",137,237,"tidytof" +2025,"Sep",141,231,"tidytof" +2025,"Oct",61,91,"tidytof" +2025,"Nov",23,24,"tidytof" +2025,"Dec",33,34,"tidytof" +2025,"all",1198,2305,"tidytof" +2025,"Jan",0,0,"SuperCellCyto" +2025,"Feb",0,0,"SuperCellCyto" +2025,"Mar",0,0,"SuperCellCyto" +2025,"Apr",0,0,"SuperCellCyto" +2025,"May",0,0,"SuperCellCyto" +2025,"Jun",0,0,"SuperCellCyto" +2025,"Jul",0,0,"SuperCellCyto" +2025,"Aug",0,0,"SuperCellCyto" +2025,"Sep",0,0,"SuperCellCyto" +2025,"Oct",101,190,"SuperCellCyto" +2025,"Nov",115,195,"SuperCellCyto" +2025,"Dec",128,195,"SuperCellCyto" +2025,"all",336,580,"SuperCellCyto" diff --git a/course/03_InsideFCSFile/data/BioconductorFlow.csv b/course/03_InsideFCSFile/data/BioconductorFlow.csv index e516213..5e2537f 100644 --- a/course/03_InsideFCSFile/data/BioconductorFlow.csv +++ b/course/03_InsideFCSFile/data/BioconductorFlow.csv @@ -1,69 +1,69 @@ -"package","since","license","version" -"flowCore",19,"Artistic-2.0","3.22" -"cytolib",8.5,"AGPL-3.0-only","3.22" -"flowWorkspace",14.5,"AGPL-3.0-only","3.22" -"ncdfFlow",14.5,"AGPL-3.0-only","3.22" -"flowViz",19,"Artistic-2.0","3.22" -"FlowSOM",11,"GPL (>= 2)","3.22" -"ggcyto",10,"file LICENSE","3.22" -"openCyto",12.5,"AGPL-3.0-only","3.22" -"quantiseqr",4.5,"GPL (>= 3)","3.22" -"flowStats",17,"Artistic-2.0","3.22" -"CytoML",9.5,"AGPL-3.0-only","3.22" -"CATALYST",9,"GPL (>= 2)","3.22" -"flowAI",10,"GPL (>= 2)","3.22" -"diffcyt",8,"MIT + file LICENSE","3.22" -"flowDensity",11.5,"Artistic-2.0","3.22" -"flowMeans",16,"Artistic-2.0","3.22" -"PeacoQC",5.5,"GPL (>= 3)","3.22" -"flowFP",16.5,"Artistic-2.0","3.22" -"flowClean",11.5,"Artistic-2.0","3.22" -"flowPeaks",13.5,"Artistic-1.0","3.22" -"COMPASS",12,"Artistic-2.0","3.22" -"SamSPECTRAL",16,"GPL (>= 2)","3.22" -"flowVS",11,"Artistic-2.0","3.22" -"cydar",9,"GPL (>= 3)","3.22" -"flowMerge",16.5,"Artistic-2.0","3.22" -"flowTrans",16,"Artistic-2.0","3.22" -"distinct",6,"GPL (>= 3)","3.22" -"flowCut",5.5,"Artistic-2.0","3.22" -"flowMatch",12,"Artistic-2.0","3.22" -"flowBeads",12.5,"Artistic-2.0","3.22" -"flowTime",9,"Artistic-2.0","3.22" -"sccomp",4,"GPL (>= 3)","3.22" -"flowCHIC",11.5,"GPL (>= 2)","3.22" -"flowSpecs",6.5,"MIT + file LICENSE","3.22" -"DepecheR",7,"MIT + file LICENSE","3.22" -"treekoR",4.5,"GPL (>= 3)","3.22" -"flowBin",12,"Artistic-2.0","3.22" -"MetaCyto",8.5,"GPL (>= 2)","3.22" -"immunoClust",11,"Artistic-2.0","3.22" -"scDataviz",5.5,"GPL (>= 3)","3.22" -"cytoMEM",4,"GPL (>= 3)","3.22" -"flowPloidy",9.5,"GPL (>= 3)","3.22" -"plotGrouper",7.5,"GPL (>= 3)","3.22" -"CytoDx",8,"GPL (>= 2)","3.22" -"Sconify",8,"Artistic-2.0","3.22" -"flowPlots",15,"Artistic-2.0","3.22" -"GateFinder",8,"Artistic-2.0","3.22" -"flowGate",3,"MIT + file LICENSE","3.22" -"flowGraph",4.5,"Artistic-2.0","3.22" -"infinityFlow",5.5,"GPL (>= 3)","3.22" -"cyanoFilter",4.5,"MIT + file LICENSE","3.22" -"optimalFlow",6,"Artistic-2.0","3.22" -"CytoGLMM",4.5,"LGPL-3","3.22" -"scifer",3.5,"MIT + file LICENSE","3.22" -"cytoKernel",4.5,"GPL (>= 3)","3.22" -"CytoPipeline",3,"GPL (>= 3)","3.22" -"censcyt",4.5,"MIT + file LICENSE","3.22" -"flowCyBar",12,"GPL (>= 2)","3.22" -"reconsi",6,"GPL (>= 2)","3.22" -"MACSQuantifyR",6.5,"Artistic-2.0","3.22" -"CytoMDS",2,"GPL (>= 3)","3.22" -"CytoPipelineGUI",2.5,"GPL (>= 3)","3.22" -"MAPFX",2,"GPL (>= 2)","3.22" -"spillR",2,"LGPL-3","3.22" -"tidyFlowCore",1.5,"MIT + file LICENSE","3.22" -"CyTOFpower",4.5,"LGPL-3","3.22" -"tidytof",1.5,"MIT + file LICENSE","3.22" -"SuperCellCyto",0,"GPL (>= 3)","3.22" +"package","since","license","version" +"flowCore",19,"Artistic-2.0","3.22" +"cytolib",8.5,"AGPL-3.0-only","3.22" +"flowWorkspace",14.5,"AGPL-3.0-only","3.22" +"ncdfFlow",14.5,"AGPL-3.0-only","3.22" +"flowViz",19,"Artistic-2.0","3.22" +"FlowSOM",11,"GPL (>= 2)","3.22" +"ggcyto",10,"file LICENSE","3.22" +"openCyto",12.5,"AGPL-3.0-only","3.22" +"quantiseqr",4.5,"GPL (>= 3)","3.22" +"flowStats",17,"Artistic-2.0","3.22" +"CytoML",9.5,"AGPL-3.0-only","3.22" +"CATALYST",9,"GPL (>= 2)","3.22" +"flowAI",10,"GPL (>= 2)","3.22" +"diffcyt",8,"MIT + file LICENSE","3.22" +"flowDensity",11.5,"Artistic-2.0","3.22" +"flowMeans",16,"Artistic-2.0","3.22" +"PeacoQC",5.5,"GPL (>= 3)","3.22" +"flowFP",16.5,"Artistic-2.0","3.22" +"flowClean",11.5,"Artistic-2.0","3.22" +"flowPeaks",13.5,"Artistic-1.0","3.22" +"COMPASS",12,"Artistic-2.0","3.22" +"SamSPECTRAL",16,"GPL (>= 2)","3.22" +"flowVS",11,"Artistic-2.0","3.22" +"cydar",9,"GPL (>= 3)","3.22" +"flowMerge",16.5,"Artistic-2.0","3.22" +"flowTrans",16,"Artistic-2.0","3.22" +"distinct",6,"GPL (>= 3)","3.22" +"flowCut",5.5,"Artistic-2.0","3.22" +"flowMatch",12,"Artistic-2.0","3.22" +"flowBeads",12.5,"Artistic-2.0","3.22" +"flowTime",9,"Artistic-2.0","3.22" +"sccomp",4,"GPL (>= 3)","3.22" +"flowCHIC",11.5,"GPL (>= 2)","3.22" +"flowSpecs",6.5,"MIT + file LICENSE","3.22" +"DepecheR",7,"MIT + file LICENSE","3.22" +"treekoR",4.5,"GPL (>= 3)","3.22" +"flowBin",12,"Artistic-2.0","3.22" +"MetaCyto",8.5,"GPL (>= 2)","3.22" +"immunoClust",11,"Artistic-2.0","3.22" +"scDataviz",5.5,"GPL (>= 3)","3.22" +"cytoMEM",4,"GPL (>= 3)","3.22" +"flowPloidy",9.5,"GPL (>= 3)","3.22" +"plotGrouper",7.5,"GPL (>= 3)","3.22" +"CytoDx",8,"GPL (>= 2)","3.22" +"Sconify",8,"Artistic-2.0","3.22" +"flowPlots",15,"Artistic-2.0","3.22" +"GateFinder",8,"Artistic-2.0","3.22" +"flowGate",3,"MIT + file LICENSE","3.22" +"flowGraph",4.5,"Artistic-2.0","3.22" +"infinityFlow",5.5,"GPL (>= 3)","3.22" +"cyanoFilter",4.5,"MIT + file LICENSE","3.22" +"optimalFlow",6,"Artistic-2.0","3.22" +"CytoGLMM",4.5,"LGPL-3","3.22" +"scifer",3.5,"MIT + file LICENSE","3.22" +"cytoKernel",4.5,"GPL (>= 3)","3.22" +"CytoPipeline",3,"GPL (>= 3)","3.22" +"censcyt",4.5,"MIT + file LICENSE","3.22" +"flowCyBar",12,"GPL (>= 2)","3.22" +"reconsi",6,"GPL (>= 2)","3.22" +"MACSQuantifyR",6.5,"Artistic-2.0","3.22" +"CytoMDS",2,"GPL (>= 3)","3.22" +"CytoPipelineGUI",2.5,"GPL (>= 3)","3.22" +"MAPFX",2,"GPL (>= 2)","3.22" +"spillR",2,"LGPL-3","3.22" +"tidyFlowCore",1.5,"MIT + file LICENSE","3.22" +"CyTOFpower",4.5,"LGPL-3","3.22" +"tidytof",1.5,"MIT + file LICENSE","3.22" +"SuperCellCyto",0,"GPL (>= 3)","3.22" diff --git a/course/03_InsideFCSFile/homeworks/README.md b/course/03_InsideFCSFile/homeworks/README.md index 2818b5e..fe53443 100644 --- a/course/03_InsideFCSFile/homeworks/README.md +++ b/course/03_InsideFCSFile/homeworks/README.md @@ -1,5 +1,5 @@ -# Turning In Optional Take-Home Problems - -This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. - +# Turning In Optional Take-Home Problems + +This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. + Within your branch, inside this "homeworks" folder, create a new folder (name it with your GitHub username). Then copy all files you will be submitting within your folder. Then commit the change to git, and push to GitHub. See [Getting Help](/course/00_Homeworks/index.qmd)for details on submitting the pull request to the UMGCCCFCSR/CytometryInR homework branch. \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/.vscode/settings.json b/course/03_InsideFCSFile/homeworks/claude-chew/.vscode/settings.json new file mode 100644 index 0000000..a490b61 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "githubPullRequests.ignoredPullRequestBranches": [ + "main" + ] +} \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Class.qmd b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Class.qmd new file mode 100644 index 0000000..ee4a14e --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Class.qmd @@ -0,0 +1,270 @@ +# Week 3 Class + +# Set up File Paths +```{r} +PathToDataFolder <- file.path("data") +PathToDataFolder +``` + +# Locate .fcs files +```{r} +fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) +fcs_files +basename(fcs_files) +``` + +# flowCore +```{r} +# I have attached this code for anyone that is interested in seeing how these plots were made. The content is not part of today's lesson, so if you are just starting off, we will cover the details of data-tidying and creating ggplot objects over the next several weeks. Best, David + +# Load required packages via a library call + +library(dplyr) # CRAN +library(stringr) # CRAN +library(ggplot2) # CRAN +library(plotly) # Using the :: to access + +# Loading in the dataset contained within the .csv file +BioconductorFlow_path <- file.path(PathToDataFolder, "BioconductorFlow.csv") +BioconductorFlowPackages <- read.csv(BioconductorFlow_path, check.names=FALSE) +BioconductorFlowPackages <- BioconductorFlowPackages |> + arrange(desc(since)) |> mutate(package = factor(package, levels = package)) + +# Newer Base R Pipe : |> +# Older mostly equivalent Magrittr Pipe %>% +``` + + +```{r} +# Notice the code-chunk eval arguments above dictate the shape of the final rendered plot. + +# Taking the imported dataset and passing it to ggplot2 to create the first plot. + +plot <- ggplot(BioconductorFlowPackages, + aes(x = 0, xend = since, y = package, yend = package)) + + geom_segment(linewidth = 2, color = "steelblue") + + scale_x_continuous(trans = "reverse", + breaks = seq(0, max(BioconductorFlowPackages$since), by = 5)) + + labs( + x = "Years in Bioconductor", + y = NULL, + title = "Bioconductor Flow Cytometry R packages" + ) + + theme_bw() + +# Taking the static plot and making it interactive using the plotly package + +plotly::ggplotly(plot) +``` + +```{r} +# Retrieving the names of Bioconductor flow cytometry R packages in correct release order. + +HistoricalOrder <- BioconductorFlowPackages |> pull(package) + +# Bringing in 2025 package usage dataset from a .csv file +BioconductorUsage_path <- file.path(PathToDataFolder, "BioconductorDownloads.csv") +BioconductorUsage <- read.csv(BioconductorUsage_path, check.names=FALSE) +BioconductorUsage <- BioconductorUsage |> dplyr::filter(Month %in% "all") + +# Note, dplyr::filter is used due to flowCore also having a filter function, which causes conflicts once it is attached to the local environment. + +# Combining both data.frames for use in the plot + +Dataset <- left_join(BioconductorFlowPackages, BioconductorUsage, by="package") + +# Rearranging the order in which packages are displayed + +Dataset$package <- factor(Dataset$package, levels=HistoricalOrder) +``` + + +```{r} +# Generating the 2nd plot with ggplot2 + +plot <- ggplot(Dataset, aes(x = since, y = Nb_of_distinct_IPs)) + + geom_point(aes(color = package), size = 3, alpha = 0.7) + + labs( + x = "Years in Bioconductor", + y = "Number of Yearly Downloads", + title = "", + color = "Package" + ) + + theme_bw() + +# Making it interactive with plotly + +plotly::ggplotly(plot) +``` + + +```{r} +library(flowCore) +# Or when in Positron, hovering over the highlighted function name within the code-chunk + +?flowCore::read.FCS +``` + +```{r} +firstfile <- fcs_files[1] +firstfile +``` + +# flowFrame + +```{r} +read.FCS(filename=firstfile) +flowFrame <- read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range=FALSE) +class(flowFrame) + +MFI_Matrix <- flowFrame@exprs +MFI_Matrix_Alternate <- exprs(flowFrame) +head(MFI_Matrix, 5) + +ColumnNames <- colnames(MFI_Matrix) +ColumnNames +str(ColumnNames) +class(ColumnNames) +unname(ColumnNames) + +MFI_Matrix[,1] +MFI_Matrix[,61] +MFI_Matrix[,350] +MFI_Matrix[1,] +MFI_Matrix[1,2] +``` + +# parameters +```{r} +ParameterData <- flowFrame@parameters@data +head(ParameterData, 10) +ParameterData_Alternate <- parameters(flowFrame)@data +str(ParameterData) + +ParameterData@ +ParameterData$name + +ParameterData[,1] +``` + +# dimLabels +```{r} +flowFrame@parameters@dimLabels +``` + +# classVersion +```{r} +flowFrame@parameters@.__classVersion__ +``` + +# Description +```{r} +DescriptionList <- flowFrame@description +DescriptionList +head(DescriptionList,5) +DescriptionList[1:10] +DescriptionList_Alternate <- keyword(flowFrame) +class(DescriptionList) + +Fluorophores <- c("BV421", "FITC","PE","APC") +class(Fluorophores) + +PanelAntibodyCounts <- c(5,12,19,26,34,46,51) +class(PanelAntibodyCounts) + +SpecimenIndexToKeep <- c(TRUE, TRUE, FALSE, TRUE) +class(SpecimenIndexToKeep) + +MyListofVectors <- list(Fluorophores, PanelAntibodyCounts, SpecimenIndexToKeep) +str(MyListofVectors) + +str(DescriptionList[1:10]) + +MyNamedListofVectors <- list(FluorophoresNamed=Fluorophores, PanelAntibodyCountsNamed=PanelAntibodyCounts, SpecimenIndexToKeepNamed=SpecimenIndexToKeep) + +str(MyNamedListofVectors) + +MyNamedListofVectors$FluorophoresNamed +MyNamedListofVectors[1] +``` + +# Keyword Madness + +```{r} +Subset <- DescriptionList[1:18] +DescriptionList$`$BTIM` +DescriptionList$`$CYT` +DescriptionList$`$CYTSN` +DescriptionList$`$DATE` +DescriptionList$`$ETIM` +DescriptionList$`$FIL` +DescriptionList$`$OP` +``` + +# Detector Values + +```{r} +Detectors <- DescriptionList[20:384] +Detectors + +DescriptionList$`$P7B` +DescriptionList$`$P7E` +DescriptionList$`$P7N` +DescriptionList$`$P7R` +DescriptionList$`$P7TYPE` +DescriptionList$`$P7V` +``` + +# Middle Metadata + +```{r} +Detectors <- DescriptionList[385:398] +Detectors + +DescriptionList$`$PROJ` +DescriptionList$`$SPILLOVER` +DescriptionList$`$TOT` +DescriptionList$`$VOL` +DescriptionList$CREATOR + +Detectors <- DescriptionList[390:398] +Detectors +DescriptionList$FILENAME +DescriptionList$GROUPNAME +``` + +# Laser Metadata + +```{r} +Detectors <- DescriptionList[399:410] +Detectors +``` + +# Display + +```{r} +Detectors <- DescriptionList[412:472] +Detectors + +Detectors <- DescriptionList[473:476] +Detectors +``` + +# flowCore Parameters + +```{r} +flowCoreCheck <-read.FCS(filename=firstfile, transformation=TRUE, truncate_max_range=FALSE) + +flowCoreCheck + +YesChange <-keyword(flowCoreCheck) +Detectors <- YesChange [476:500] +Detectors + +flowCoreCheck <-read.FCS(filename=firstfile, transformation=FALSE, truncate_max_range=FALSE) + +NoChange <- keyword(flowCoreCheck) +Detectors <- NoChange[476:500] +Detectors + +``` \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.html b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.html new file mode 100644 index 0000000..79fda98 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.html @@ -0,0 +1,4137 @@ + + + + + + + + + +week3homework + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+

Problem 1

+

Today’s walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26…). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc.

+
+
+

Problem 1 Code

+
+
PathToDataFolder <- file.path("data/AdditionalFCSFiles")
+PathToDataFolder
+
+
[1] "data/AdditionalFCSFiles"
+
+
# Locate .fcs files
+fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE)
+fcs_files
+
+
[1] "data/AdditionalFCSFiles/2025-10_22_Contrad.fcs"            
+[2] "data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+
# Locate unmixed .fcs file
+unmixed_file <- list.files(PathToDataFolder, pattern="2025_07_26", full.names=TRUE)
+unmixed_file
+
+
[1] "data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+
# Read unmixed .fcs file
+library(flowCore)
+read.FCS(filename=unmixed_file)
+
+
flowFrame object '2025_07_26_AB_02_NY068_02_Ctrl.fcs'
+with 100 cells and 43 observables:
+               name      desc     range  minRange    maxRange
+$P1            Time        NA    516839         0     506.501
+$P2           SSC-W        NA   4194304         0 4194303.000
+$P3           SSC-H        NA   4194304         0 4194303.000
+$P4           SSC-A        NA   4194304         0 4194303.000
+$P5           FSC-W        NA   4194304         0 4194303.000
+...             ...       ...       ...       ...         ...
+$P39     APC-R700-A    CD107a   4194304      -111     4192506
+$P40   Zombie NIR-A Viability   4194304      -111     4192506
+$P41 APC-Fire 750-A      CD27   4194304      -111     4192506
+$P42 APC-Fire 810-A      CCR7   4194304      -111     4192506
+$P43           AF-A        NA   4194304      -111     4194303
+472 keywords are stored in the 'description' slot
+
+
flowFrame <- read.FCS(filename=unmixed_file, transformation = TRUE, truncate_max_range = FALSE)
+class(flowFrame)
+
+
[1] "flowFrame"
+attr(,"package")
+[1] "flowCore"
+
+
MFI_Matrix <- flowFrame@exprs
+ColumnNames <- colnames(MFI_Matrix)
+class(ColumnNames)
+
+
[1] "character"
+
+
# Explore parameters
+ParameterData <- flowFrame@parameters@data
+str(ParameterData)
+
+
'data.frame':   43 obs. of  5 variables:
+ $ name    : 'AsIs' Named chr  "Time" "SSC-W" "SSC-H" "SSC-A" ...
+  ..- attr(*, "names")= chr [1:43] "$P1N" "$P2N" "$P3N" "$P4N" ...
+ $ desc    : 'AsIs' Named chr  NA NA NA NA ...
+  ..- attr(*, "names")= chr [1:43] NA NA NA NA ...
+ $ range   : num  516839 4194304 4194304 4194304 4194304 ...
+ $ minRange: num  0 0 0 0 0 0 0 0 0 0 ...
+ $ maxRange: num  507 4194303 4194303 4194303 4194303 ...
+
+
# Explore Description
+DescriptionList <- flowFrame@description
+DescriptionList
+
+
$`$BEGINANALYSIS`
+[1] "0"
+
+$`$BEGINDATA`
+[1] "18357"
+
+$`$BEGINSTEXT`
+[1] "0"
+
+$`$BTIM`
+[1] "21:30:10.27"
+
+$`$BYTEORD`
+[1] "4,3,2,1"
+
+$`$CYT`
+[1] "Aurora"
+
+$`$CYTOLIB_VERSION`
+[1] "2.22.0"
+
+$`$CYTSN`
+[1] "U1368"
+
+$`$DATATYPE`
+[1] "F"
+
+$`$DATE`
+[1] "26-Jul-2025"
+
+$`$ENDANALYSIS`
+[1] "0"
+
+$`$ENDDATA`
+[1] "35556"
+
+$`$ENDSTEXT`
+[1] "0"
+
+$`$ETIM`
+[1] "21:31:01.86"
+
+$`$FIL`
+[1] "Ctrl.fcs"
+
+$`$INST`
+[1] "Cytekbio"
+
+$`$MODE`
+[1] "L"
+
+$`$NEXTDATA`
+[1] "0"
+
+$`$OP`
+[1] "David Rach"
+
+$`$P10B`
+[1] "32"
+
+$`$P10E`
+[1] "0,0"
+
+$`$P10N`
+[1] "SSC-B-A"
+
+$`$P10R`
+[1] "4194304"
+
+$`$P10TYPE`
+[1] "Side_Scatter"
+
+$`$P10V`
+[1] "266"
+
+$`$P11B`
+[1] "32"
+
+$`$P11E`
+[1] "0,0"
+
+$`$P11N`
+[1] "BUV395-A"
+
+$`$P11R`
+[1] "4194304"
+
+$`$P11S`
+[1] "CD62L"
+
+$`$P11TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P11V`
+[1] "0"
+
+$`$P12B`
+[1] "32"
+
+$`$P12E`
+[1] "0,0"
+
+$`$P12N`
+[1] "BUV563-A"
+
+$`$P12R`
+[1] "4194304"
+
+$`$P12S`
+[1] "CD69"
+
+$`$P12TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P12V`
+[1] "0"
+
+$`$P13B`
+[1] "32"
+
+$`$P13E`
+[1] "0,0"
+
+$`$P13N`
+[1] "BUV615-A"
+
+$`$P13R`
+[1] "4194304"
+
+$`$P13S`
+[1] "CCR4"
+
+$`$P13TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P13V`
+[1] "0"
+
+$`$P14B`
+[1] "32"
+
+$`$P14E`
+[1] "0,0"
+
+$`$P14N`
+[1] "BUV661-A"
+
+$`$P14R`
+[1] "4194304"
+
+$`$P14S`
+[1] "Vd2"
+
+$`$P14TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P14V`
+[1] "0"
+
+$`$P15B`
+[1] "32"
+
+$`$P15E`
+[1] "0,0"
+
+$`$P15N`
+[1] "BUV737-A"
+
+$`$P15R`
+[1] "4194304"
+
+$`$P15S`
+[1] "CD38"
+
+$`$P15TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P15V`
+[1] "0"
+
+$`$P16B`
+[1] "32"
+
+$`$P16E`
+[1] "0,0"
+
+$`$P16N`
+[1] "BUV805-A"
+
+$`$P16R`
+[1] "4194304"
+
+$`$P16S`
+[1] "CD4"
+
+$`$P16TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P16V`
+[1] "0"
+
+$`$P17B`
+[1] "32"
+
+$`$P17E`
+[1] "0,0"
+
+$`$P17N`
+[1] "Pacific Blue-A"
+
+$`$P17R`
+[1] "4194304"
+
+$`$P17S`
+[1] "Dump"
+
+$`$P17TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P17V`
+[1] "0"
+
+$`$P18B`
+[1] "32"
+
+$`$P18E`
+[1] "0,0"
+
+$`$P18N`
+[1] "BV480-A"
+
+$`$P18R`
+[1] "4194304"
+
+$`$P18S`
+[1] "CD161"
+
+$`$P18TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P18V`
+[1] "0"
+
+$`$P19B`
+[1] "32"
+
+$`$P19E`
+[1] "0,0"
+
+$`$P19N`
+[1] "BV570-A"
+
+$`$P19R`
+[1] "4194304"
+
+$`$P19S`
+[1] "CD16"
+
+$`$P19TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P19V`
+[1] "0"
+
+$`$P1B`
+[1] "32"
+
+$`$P1E`
+[1] "0,0"
+
+$`$P1N`
+[1] "Time"
+
+$`$P1R`
+[1] "516839"
+
+$`$P1TYPE`
+[1] "Time"
+
+$`$P20B`
+[1] "32"
+
+$`$P20E`
+[1] "0,0"
+
+$`$P20N`
+[1] "BV605-A"
+
+$`$P20R`
+[1] "4194304"
+
+$`$P20S`
+[1] "CD45RA"
+
+$`$P20TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P20V`
+[1] "0"
+
+$`$P21B`
+[1] "32"
+
+$`$P21E`
+[1] "0,0"
+
+$`$P21N`
+[1] "BV650-A"
+
+$`$P21R`
+[1] "4194304"
+
+$`$P21S`
+[1] "CD8"
+
+$`$P21TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P21V`
+[1] "0"
+
+$`$P22B`
+[1] "32"
+
+$`$P22E`
+[1] "0,0"
+
+$`$P22N`
+[1] "BV711-A"
+
+$`$P22R`
+[1] "4194304"
+
+$`$P22S`
+[1] "Va7.2"
+
+$`$P22TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P22V`
+[1] "0"
+
+$`$P23B`
+[1] "32"
+
+$`$P23E`
+[1] "0,0"
+
+$`$P23N`
+[1] "BV750-A"
+
+$`$P23R`
+[1] "4194304"
+
+$`$P23S`
+[1] "IFNg"
+
+$`$P23TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P23V`
+[1] "0"
+
+$`$P24B`
+[1] "32"
+
+$`$P24E`
+[1] "0,0"
+
+$`$P24N`
+[1] "BV786-A"
+
+$`$P24R`
+[1] "4194304"
+
+$`$P24S`
+[1] "CCR6"
+
+$`$P24TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P24V`
+[1] "0"
+
+$`$P25B`
+[1] "32"
+
+$`$P25E`
+[1] "0,0"
+
+$`$P25N`
+[1] "Alexa Fluor 488-A"
+
+$`$P25R`
+[1] "4194304"
+
+$`$P25S`
+[1] "FoxP3"
+
+$`$P25TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P25V`
+[1] "0"
+
+$`$P26B`
+[1] "32"
+
+$`$P26E`
+[1] "0,0"
+
+$`$P26N`
+[1] "Spark Blue 550-A"
+
+$`$P26R`
+[1] "4194304"
+
+$`$P26S`
+[1] "CD3"
+
+$`$P26TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P26V`
+[1] "0"
+
+$`$P27B`
+[1] "32"
+
+$`$P27E`
+[1] "0,0"
+
+$`$P27N`
+[1] "Spark Blue 574-A"
+
+$`$P27R`
+[1] "4194304"
+
+$`$P27S`
+[1] "CD45"
+
+$`$P27TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P27V`
+[1] "0"
+
+$`$P28B`
+[1] "32"
+
+$`$P28E`
+[1] "0,0"
+
+$`$P28N`
+[1] "RB613-A"
+
+$`$P28R`
+[1] "4194304"
+
+$`$P28S`
+[1] "PD1"
+
+$`$P28TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P28V`
+[1] "0"
+
+$`$P29B`
+[1] "32"
+
+$`$P29E`
+[1] "0,0"
+
+$`$P29N`
+[1] "RB705-A"
+
+$`$P29R`
+[1] "4194304"
+
+$`$P29S`
+[1] "CD26"
+
+$`$P29TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P29V`
+[1] "0"
+
+$`$P2B`
+[1] "32"
+
+$`$P2E`
+[1] "0,0"
+
+$`$P2N`
+[1] "SSC-W"
+
+$`$P2R`
+[1] "4194304"
+
+$`$P2TYPE`
+[1] "Side_Scatter"
+
+$`$P2V`
+[1] "350"
+
+$`$P30B`
+[1] "32"
+
+$`$P30E`
+[1] "0,0"
+
+$`$P30N`
+[1] "RB780-A"
+
+$`$P30R`
+[1] "4194304"
+
+$`$P30S`
+[1] "CXCR5"
+
+$`$P30TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P30V`
+[1] "0"
+
+$`$P31B`
+[1] "32"
+
+$`$P31E`
+[1] "0,0"
+
+$`$P31N`
+[1] "PE-A"
+
+$`$P31R`
+[1] "4194304"
+
+$`$P31S`
+[1] "ICOS"
+
+$`$P31TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P31V`
+[1] "0"
+
+$`$P32B`
+[1] "32"
+
+$`$P32E`
+[1] "0,0"
+
+$`$P32N`
+[1] "PE-Dazzle594-A"
+
+$`$P32R`
+[1] "4194304"
+
+$`$P32S`
+[1] "TNFa"
+
+$`$P32TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P32V`
+[1] "0"
+
+$`$P33B`
+[1] "32"
+
+$`$P33E`
+[1] "0,0"
+
+$`$P33N`
+[1] "PE-Cy5-A"
+
+$`$P33R`
+[1] "4194304"
+
+$`$P33S`
+[1] "CXCR3"
+
+$`$P33TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P33V`
+[1] "0"
+
+$`$P34B`
+[1] "32"
+
+$`$P34E`
+[1] "0,0"
+
+$`$P34N`
+[1] "PE-Fire 700-A"
+
+$`$P34R`
+[1] "4194304"
+
+$`$P34S`
+[1] "CD127"
+
+$`$P34TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P34V`
+[1] "0"
+
+$`$P35B`
+[1] "32"
+
+$`$P35E`
+[1] "0,0"
+
+$`$P35N`
+[1] "PE-Fire 744-A"
+
+$`$P35R`
+[1] "4194304"
+
+$`$P35S`
+[1] "CD25"
+
+$`$P35TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P35V`
+[1] "0"
+
+$`$P36B`
+[1] "32"
+
+$`$P36E`
+[1] "0,0"
+
+$`$P36N`
+[1] "PE-Vio770-A"
+
+$`$P36R`
+[1] "4194304"
+
+$`$P36S`
+[1] "HLA-DR"
+
+$`$P36TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P36V`
+[1] "0"
+
+$`$P37B`
+[1] "32"
+
+$`$P37E`
+[1] "0,0"
+
+$`$P37N`
+[1] "APC-A"
+
+$`$P37R`
+[1] "4194304"
+
+$`$P37S`
+[1] "CD39"
+
+$`$P37TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P37V`
+[1] "0"
+
+$`$P38B`
+[1] "32"
+
+$`$P38E`
+[1] "0,0"
+
+$`$P38N`
+[1] "Alexa Fluor 647-A"
+
+$`$P38R`
+[1] "4194304"
+
+$`$P38S`
+[1] "IL-2"
+
+$`$P38TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P38V`
+[1] "0"
+
+$`$P39B`
+[1] "32"
+
+$`$P39E`
+[1] "0,0"
+
+$`$P39N`
+[1] "APC-R700-A"
+
+$`$P39R`
+[1] "4194304"
+
+$`$P39S`
+[1] "CD107a"
+
+$`$P39TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P39V`
+[1] "0"
+
+$`$P3B`
+[1] "32"
+
+$`$P3E`
+[1] "0,0"
+
+$`$P3N`
+[1] "SSC-H"
+
+$`$P3R`
+[1] "4194304"
+
+$`$P3TYPE`
+[1] "Side_Scatter"
+
+$`$P3V`
+[1] "350"
+
+$`$P40B`
+[1] "32"
+
+$`$P40E`
+[1] "0,0"
+
+$`$P40N`
+[1] "Zombie NIR-A"
+
+$`$P40R`
+[1] "4194304"
+
+$`$P40S`
+[1] "Viability"
+
+$`$P40TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P40V`
+[1] "0"
+
+$`$P41B`
+[1] "32"
+
+$`$P41E`
+[1] "0,0"
+
+$`$P41N`
+[1] "APC-Fire 750-A"
+
+$`$P41R`
+[1] "4194304"
+
+$`$P41S`
+[1] "CD27"
+
+$`$P41TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P41V`
+[1] "0"
+
+$`$P42B`
+[1] "32"
+
+$`$P42E`
+[1] "0,0"
+
+$`$P42N`
+[1] "APC-Fire 810-A"
+
+$`$P42R`
+[1] "4194304"
+
+$`$P42S`
+[1] "CCR7"
+
+$`$P42TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P42V`
+[1] "0"
+
+$`$P43B`
+[1] "32"
+
+$`$P43E`
+[1] "0,0"
+
+$`$P43N`
+[1] "AF-A"
+
+$`$P43R`
+[1] "4194304"
+
+$`$P43TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P43V`
+[1] "0"
+
+$`$P4B`
+[1] "32"
+
+$`$P4E`
+[1] "0,0"
+
+$`$P4N`
+[1] "SSC-A"
+
+$`$P4R`
+[1] "4194304"
+
+$`$P4TYPE`
+[1] "Side_Scatter"
+
+$`$P4V`
+[1] "350"
+
+$`$P5B`
+[1] "32"
+
+$`$P5E`
+[1] "0,0"
+
+$`$P5N`
+[1] "FSC-W"
+
+$`$P5R`
+[1] "4194304"
+
+$`$P5TYPE`
+[1] "Forward_Scatter"
+
+$`$P5V`
+[1] "64"
+
+$`$P6B`
+[1] "32"
+
+$`$P6E`
+[1] "0,0"
+
+$`$P6N`
+[1] "FSC-H"
+
+$`$P6R`
+[1] "4194304"
+
+$`$P6TYPE`
+[1] "Forward_Scatter"
+
+$`$P6V`
+[1] "64"
+
+$`$P7B`
+[1] "32"
+
+$`$P7E`
+[1] "0,0"
+
+$`$P7N`
+[1] "FSC-A"
+
+$`$P7R`
+[1] "4194304"
+
+$`$P7TYPE`
+[1] "Forward_Scatter"
+
+$`$P7V`
+[1] "64"
+
+$`$P8B`
+[1] "32"
+
+$`$P8E`
+[1] "0,0"
+
+$`$P8N`
+[1] "SSC-B-W"
+
+$`$P8R`
+[1] "4194304"
+
+$`$P8TYPE`
+[1] "Side_Scatter"
+
+$`$P8V`
+[1] "266"
+
+$`$P9B`
+[1] "32"
+
+$`$P9E`
+[1] "0,0"
+
+$`$P9N`
+[1] "SSC-B-H"
+
+$`$P9R`
+[1] "4194304"
+
+$`$P9TYPE`
+[1] "Side_Scatter"
+
+$`$P9V`
+[1] "266"
+
+$`$PAR`
+[1] "43"
+
+$`$PROJ`
+[1] "2025_07_26_AB_02"
+
+$`$SPILLOVER`
+      BUV395-A BUV563-A BUV615-A BUV661-A BUV737-A BUV805-A Pacific Blue-A
+ [1,]    1e+00        0        0        0        0        0              0
+ [2,]    1e-06        1        0        0        0        0              0
+ [3,]    0e+00        0        1        0        0        0              0
+ [4,]    0e+00        0        0        1        0        0              0
+ [5,]    0e+00        0        0        0        1        0              0
+ [6,]    0e+00        0        0        0        0        1              0
+ [7,]    0e+00        0        0        0        0        0              1
+ [8,]    0e+00        0        0        0        0        0              0
+ [9,]    0e+00        0        0        0        0        0              0
+[10,]    0e+00        0        0        0        0        0              0
+[11,]    0e+00        0        0        0        0        0              0
+[12,]    0e+00        0        0        0        0        0              0
+[13,]    0e+00        0        0        0        0        0              0
+[14,]    0e+00        0        0        0        0        0              0
+[15,]    0e+00        0        0        0        0        0              0
+[16,]    0e+00        0        0        0        0        0              0
+[17,]    0e+00        0        0        0        0        0              0
+[18,]    0e+00        0        0        0        0        0              0
+[19,]    0e+00        0        0        0        0        0              0
+[20,]    0e+00        0        0        0        0        0              0
+[21,]    0e+00        0        0        0        0        0              0
+[22,]    0e+00        0        0        0        0        0              0
+[23,]    0e+00        0        0        0        0        0              0
+[24,]    0e+00        0        0        0        0        0              0
+[25,]    0e+00        0        0        0        0        0              0
+[26,]    0e+00        0        0        0        0        0              0
+[27,]    0e+00        0        0        0        0        0              0
+[28,]    0e+00        0        0        0        0        0              0
+[29,]    0e+00        0        0        0        0        0              0
+[30,]    0e+00        0        0        0        0        0              0
+[31,]    0e+00        0        0        0        0        0              0
+[32,]    0e+00        0        0        0        0        0              0
+[33,]    0e+00        0        0        0        0        0              0
+      BV480-A BV570-A BV605-A BV650-A BV711-A BV750-A BV786-A Alexa Fluor 488-A
+ [1,]       0       0       0       0       0       0       0                 0
+ [2,]       0       0       0       0       0       0       0                 0
+ [3,]       0       0       0       0       0       0       0                 0
+ [4,]       0       0       0       0       0       0       0                 0
+ [5,]       0       0       0       0       0       0       0                 0
+ [6,]       0       0       0       0       0       0       0                 0
+ [7,]       0       0       0       0       0       0       0                 0
+ [8,]       1       0       0       0       0       0       0                 0
+ [9,]       0       1       0       0       0       0       0                 0
+[10,]       0       0       1       0       0       0       0                 0
+[11,]       0       0       0       1       0       0       0                 0
+[12,]       0       0       0       0       1       0       0                 0
+[13,]       0       0       0       0       0       1       0                 0
+[14,]       0       0       0       0       0       0       1                 0
+[15,]       0       0       0       0       0       0       0                 1
+[16,]       0       0       0       0       0       0       0                 0
+[17,]       0       0       0       0       0       0       0                 0
+[18,]       0       0       0       0       0       0       0                 0
+[19,]       0       0       0       0       0       0       0                 0
+[20,]       0       0       0       0       0       0       0                 0
+[21,]       0       0       0       0       0       0       0                 0
+[22,]       0       0       0       0       0       0       0                 0
+[23,]       0       0       0       0       0       0       0                 0
+[24,]       0       0       0       0       0       0       0                 0
+[25,]       0       0       0       0       0       0       0                 0
+[26,]       0       0       0       0       0       0       0                 0
+[27,]       0       0       0       0       0       0       0                 0
+[28,]       0       0       0       0       0       0       0                 0
+[29,]       0       0       0       0       0       0       0                 0
+[30,]       0       0       0       0       0       0       0                 0
+[31,]       0       0       0       0       0       0       0                 0
+[32,]       0       0       0       0       0       0       0                 0
+[33,]       0       0       0       0       0       0       0                 0
+      Spark Blue 550-A Spark Blue 574-A RB613-A RB705-A RB780-A PE-A
+ [1,]                0                0       0       0       0    0
+ [2,]                0                0       0       0       0    0
+ [3,]                0                0       0       0       0    0
+ [4,]                0                0       0       0       0    0
+ [5,]                0                0       0       0       0    0
+ [6,]                0                0       0       0       0    0
+ [7,]                0                0       0       0       0    0
+ [8,]                0                0       0       0       0    0
+ [9,]                0                0       0       0       0    0
+[10,]                0                0       0       0       0    0
+[11,]                0                0       0       0       0    0
+[12,]                0                0       0       0       0    0
+[13,]                0                0       0       0       0    0
+[14,]                0                0       0       0       0    0
+[15,]                0                0       0       0       0    0
+[16,]                1                0       0       0       0    0
+[17,]                0                1       0       0       0    0
+[18,]                0                0       1       0       0    0
+[19,]                0                0       0       1       0    0
+[20,]                0                0       0       0       1    0
+[21,]                0                0       0       0       0    1
+[22,]                0                0       0       0       0    0
+[23,]                0                0       0       0       0    0
+[24,]                0                0       0       0       0    0
+[25,]                0                0       0       0       0    0
+[26,]                0                0       0       0       0    0
+[27,]                0                0       0       0       0    0
+[28,]                0                0       0       0       0    0
+[29,]                0                0       0       0       0    0
+[30,]                0                0       0       0       0    0
+[31,]                0                0       0       0       0    0
+[32,]                0                0       0       0       0    0
+[33,]                0                0       0       0       0    0
+      PE-Dazzle594-A PE-Cy5-A PE-Fire 700-A PE-Fire 744-A PE-Vio770-A APC-A
+ [1,]              0        0             0             0           0     0
+ [2,]              0        0             0             0           0     0
+ [3,]              0        0             0             0           0     0
+ [4,]              0        0             0             0           0     0
+ [5,]              0        0             0             0           0     0
+ [6,]              0        0             0             0           0     0
+ [7,]              0        0             0             0           0     0
+ [8,]              0        0             0             0           0     0
+ [9,]              0        0             0             0           0     0
+[10,]              0        0             0             0           0     0
+[11,]              0        0             0             0           0     0
+[12,]              0        0             0             0           0     0
+[13,]              0        0             0             0           0     0
+[14,]              0        0             0             0           0     0
+[15,]              0        0             0             0           0     0
+[16,]              0        0             0             0           0     0
+[17,]              0        0             0             0           0     0
+[18,]              0        0             0             0           0     0
+[19,]              0        0             0             0           0     0
+[20,]              0        0             0             0           0     0
+[21,]              0        0             0             0           0     0
+[22,]              1        0             0             0           0     0
+[23,]              0        1             0             0           0     0
+[24,]              0        0             1             0           0     0
+[25,]              0        0             0             1           0     0
+[26,]              0        0             0             0           1     0
+[27,]              0        0             0             0           0     1
+[28,]              0        0             0             0           0     0
+[29,]              0        0             0             0           0     0
+[30,]              0        0             0             0           0     0
+[31,]              0        0             0             0           0     0
+[32,]              0        0             0             0           0     0
+[33,]              0        0             0             0           0     0
+      Alexa Fluor 647-A APC-R700-A Zombie NIR-A APC-Fire 750-A APC-Fire 810-A
+ [1,]                 0          0            0              0              0
+ [2,]                 0          0            0              0              0
+ [3,]                 0          0            0              0              0
+ [4,]                 0          0            0              0              0
+ [5,]                 0          0            0              0              0
+ [6,]                 0          0            0              0              0
+ [7,]                 0          0            0              0              0
+ [8,]                 0          0            0              0              0
+ [9,]                 0          0            0              0              0
+[10,]                 0          0            0              0              0
+[11,]                 0          0            0              0              0
+[12,]                 0          0            0              0              0
+[13,]                 0          0            0              0              0
+[14,]                 0          0            0              0              0
+[15,]                 0          0            0              0              0
+[16,]                 0          0            0              0              0
+[17,]                 0          0            0              0              0
+[18,]                 0          0            0              0              0
+[19,]                 0          0            0              0              0
+[20,]                 0          0            0              0              0
+[21,]                 0          0            0              0              0
+[22,]                 0          0            0              0              0
+[23,]                 0          0            0              0              0
+[24,]                 0          0            0              0              0
+[25,]                 0          0            0              0              0
+[26,]                 0          0            0              0              0
+[27,]                 0          0            0              0              0
+[28,]                 1          0            0              0              0
+[29,]                 0          1            0              0              0
+[30,]                 0          0            1              0              0
+[31,]                 0          0            0              1              0
+[32,]                 0          0            0              0              1
+[33,]                 0          0            0              0              0
+      AF-A
+ [1,]    0
+ [2,]    0
+ [3,]    0
+ [4,]    0
+ [5,]    0
+ [6,]    0
+ [7,]    0
+ [8,]    0
+ [9,]    0
+[10,]    0
+[11,]    0
+[12,]    0
+[13,]    0
+[14,]    0
+[15,]    0
+[16,]    0
+[17,]    0
+[18,]    0
+[19,]    0
+[20,]    0
+[21,]    0
+[22,]    0
+[23,]    0
+[24,]    0
+[25,]    0
+[26,]    0
+[27,]    0
+[28,]    0
+[29,]    0
+[30,]    0
+[31,]    0
+[32,]    0
+[33,]    1
+
+$`$TIMESTEP`
+[1] "0.0001"
+
+$`$TOT`
+[1] "100"
+
+$`$VOL`
+[1] "60.66"
+
+$`APPLY COMPENSATION`
+[1] "FALSE"
+
+$CHARSET
+[1] "utf-8"
+
+$CREATOR
+[1] "SpectroFlo 3.3.0"
+
+$FCSversion
+[1] "3"
+
+$FILENAME
+[1] "data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+$`flowCore_$P10Rmax`
+[1] "4194303"
+
+$`flowCore_$P10Rmin`
+[1] "0"
+
+$`flowCore_$P11Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P11Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P12Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P12Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P13Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P13Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P14Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P14Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P15Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P15Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P16Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P16Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P17Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P17Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P18Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P18Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P19Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P19Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P1Rmax`
+[1] "506.501251220703"
+
+$`flowCore_$P1Rmin`
+[1] "0"
+
+$`flowCore_$P20Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P20Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P21Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P21Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P22Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P22Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P23Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P23Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P24Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P24Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P25Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P25Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P26Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P26Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P27Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P27Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P28Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P28Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P29Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P29Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P2Rmax`
+[1] "4194303"
+
+$`flowCore_$P2Rmin`
+[1] "0"
+
+$`flowCore_$P30Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P30Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P31Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P31Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P32Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P32Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P33Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P33Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P34Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P34Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P35Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P35Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P36Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P36Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P37Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P37Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P38Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P38Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P39Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P39Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P3Rmax`
+[1] "4194303"
+
+$`flowCore_$P3Rmin`
+[1] "0"
+
+$`flowCore_$P40Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P40Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P41Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P41Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P42Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P42Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P43Rmax`
+[1] "4194303"
+
+$`flowCore_$P43Rmin`
+[1] "-111"
+
+$`flowCore_$P4Rmax`
+[1] "4194303"
+
+$`flowCore_$P4Rmin`
+[1] "0"
+
+$`flowCore_$P5Rmax`
+[1] "4194303"
+
+$`flowCore_$P5Rmin`
+[1] "0"
+
+$`flowCore_$P6Rmax`
+[1] "4194303"
+
+$`flowCore_$P6Rmin`
+[1] "0"
+
+$`flowCore_$P7Rmax`
+[1] "4194303"
+
+$`flowCore_$P7Rmin`
+[1] "0"
+
+$`flowCore_$P8Rmax`
+[1] "4194303"
+
+$`flowCore_$P8Rmin`
+[1] "0"
+
+$`flowCore_$P9Rmax`
+[1] "4194303"
+
+$`flowCore_$P9Rmin`
+[1] "0"
+
+$`FSC ASF`
+[1] "1.18"
+
+$GROUPNAME
+[1] "NY068_02"
+
+$GUID
+[1] "2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+$LASER1ASF
+[1] "1.12"
+
+$LASER1DELAY
+[1] "-39.65"
+
+$LASER1NAME
+[1] "YellowGreen"
+
+$LASER2ASF
+[1] "1.09"
+
+$LASER2DELAY
+[1] "-19.825"
+
+$LASER2NAME
+[1] "Violet"
+
+$LASER3ASF
+[1] "1.15"
+
+$LASER3DELAY
+[1] "0"
+
+$LASER3NAME
+[1] "Blue"
+
+$LASER4ASF
+[1] "1.04"
+
+$LASER4DELAY
+[1] "20.3"
+
+$LASER4NAME
+[1] "Red"
+
+$LASER5ASF
+[1] "1.09"
+
+$LASER5DELAY
+[1] "39.8"
+
+$LASER5NAME
+[1] "UV"
+
+$ORIGINALGUID
+[1] "2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+$P10DISPLAY
+[1] "LIN"
+
+$P11DISPLAY
+[1] "LOG"
+
+$P12DISPLAY
+[1] "LOG"
+
+$P13DISPLAY
+[1] "LOG"
+
+$P14DISPLAY
+[1] "LOG"
+
+$P15DISPLAY
+[1] "LOG"
+
+$P16DISPLAY
+[1] "LOG"
+
+$P17DISPLAY
+[1] "LOG"
+
+$P18DISPLAY
+[1] "LOG"
+
+$P19DISPLAY
+[1] "LOG"
+
+$P1DISPLAY
+[1] "LOG"
+
+$P20DISPLAY
+[1] "LOG"
+
+$P21DISPLAY
+[1] "LOG"
+
+$P22DISPLAY
+[1] "LOG"
+
+$P23DISPLAY
+[1] "LOG"
+
+$P24DISPLAY
+[1] "LOG"
+
+$P25DISPLAY
+[1] "LOG"
+
+$P26DISPLAY
+[1] "LOG"
+
+$P27DISPLAY
+[1] "LOG"
+
+$P28DISPLAY
+[1] "LOG"
+
+$P29DISPLAY
+[1] "LOG"
+
+$P2DISPLAY
+[1] "LIN"
+
+$P30DISPLAY
+[1] "LOG"
+
+$P31DISPLAY
+[1] "LOG"
+
+$P32DISPLAY
+[1] "LOG"
+
+$P33DISPLAY
+[1] "LOG"
+
+$P34DISPLAY
+[1] "LOG"
+
+$P35DISPLAY
+[1] "LOG"
+
+$P36DISPLAY
+[1] "LOG"
+
+$P37DISPLAY
+[1] "LOG"
+
+$P38DISPLAY
+[1] "LOG"
+
+$P39DISPLAY
+[1] "LOG"
+
+$P3DISPLAY
+[1] "LIN"
+
+$P40DISPLAY
+[1] "LOG"
+
+$P41DISPLAY
+[1] "LOG"
+
+$P42DISPLAY
+[1] "LOG"
+
+$P43DISPLAY
+[1] "LOG"
+
+$P4DISPLAY
+[1] "LIN"
+
+$P5DISPLAY
+[1] "LIN"
+
+$P6DISPLAY
+[1] "LIN"
+
+$P7DISPLAY
+[1] "LIN"
+
+$P8DISPLAY
+[1] "LIN"
+
+$P9DISPLAY
+[1] "LIN"
+
+$THRESHOLD
+[1] "(FSC,600000)"
+
+$transformation
+[1] "custom"
+
+$TUBENAME
+[1] "Ctrl"
+
+$USERSETTINGNAME
+[1] "DR_2025_AB_Nuclear"
+
+$`WINDOW EXTENSION`
+[1] "3"
+
+
class(DescriptionList)
+
+
[1] "list"
+
+
str(DescriptionList)
+
+
List of 472
+ $ $BEGINANALYSIS    : chr "0"
+ $ $BEGINDATA        : chr "18357"
+ $ $BEGINSTEXT       : chr "0"
+ $ $BTIM             : chr "21:30:10.27"
+ $ $BYTEORD          : chr "4,3,2,1"
+ $ $CYT              : chr "Aurora"
+ $ $CYTOLIB_VERSION  : chr "2.22.0"
+ $ $CYTSN            : chr "U1368"
+ $ $DATATYPE         : chr "F"
+ $ $DATE             : chr "26-Jul-2025"
+ $ $ENDANALYSIS      : chr "0"
+ $ $ENDDATA          : chr "35556"
+ $ $ENDSTEXT         : chr "0"
+ $ $ETIM             : chr "21:31:01.86"
+ $ $FIL              : chr "Ctrl.fcs"
+ $ $INST             : chr "Cytekbio"
+ $ $MODE             : chr "L"
+ $ $NEXTDATA         : chr "0"
+ $ $OP               : chr "David Rach"
+ $ $P10B             : chr "32"
+ $ $P10E             : chr "0,0"
+ $ $P10N             : chr "SSC-B-A"
+ $ $P10R             : chr "4194304"
+ $ $P10TYPE          : chr "Side_Scatter"
+ $ $P10V             : chr "266"
+ $ $P11B             : chr "32"
+ $ $P11E             : chr "0,0"
+ $ $P11N             : chr "BUV395-A"
+ $ $P11R             : chr "4194304"
+ $ $P11S             : chr "CD62L"
+ $ $P11TYPE          : chr "Unmixed_Fluorescence"
+ $ $P11V             : chr "0"
+ $ $P12B             : chr "32"
+ $ $P12E             : chr "0,0"
+ $ $P12N             : chr "BUV563-A"
+ $ $P12R             : chr "4194304"
+ $ $P12S             : chr "CD69"
+ $ $P12TYPE          : chr "Unmixed_Fluorescence"
+ $ $P12V             : chr "0"
+ $ $P13B             : chr "32"
+ $ $P13E             : chr "0,0"
+ $ $P13N             : chr "BUV615-A"
+ $ $P13R             : chr "4194304"
+ $ $P13S             : chr "CCR4"
+ $ $P13TYPE          : chr "Unmixed_Fluorescence"
+ $ $P13V             : chr "0"
+ $ $P14B             : chr "32"
+ $ $P14E             : chr "0,0"
+ $ $P14N             : chr "BUV661-A"
+ $ $P14R             : chr "4194304"
+ $ $P14S             : chr "Vd2"
+ $ $P14TYPE          : chr "Unmixed_Fluorescence"
+ $ $P14V             : chr "0"
+ $ $P15B             : chr "32"
+ $ $P15E             : chr "0,0"
+ $ $P15N             : chr "BUV737-A"
+ $ $P15R             : chr "4194304"
+ $ $P15S             : chr "CD38"
+ $ $P15TYPE          : chr "Unmixed_Fluorescence"
+ $ $P15V             : chr "0"
+ $ $P16B             : chr "32"
+ $ $P16E             : chr "0,0"
+ $ $P16N             : chr "BUV805-A"
+ $ $P16R             : chr "4194304"
+ $ $P16S             : chr "CD4"
+ $ $P16TYPE          : chr "Unmixed_Fluorescence"
+ $ $P16V             : chr "0"
+ $ $P17B             : chr "32"
+ $ $P17E             : chr "0,0"
+ $ $P17N             : chr "Pacific Blue-A"
+ $ $P17R             : chr "4194304"
+ $ $P17S             : chr "Dump"
+ $ $P17TYPE          : chr "Unmixed_Fluorescence"
+ $ $P17V             : chr "0"
+ $ $P18B             : chr "32"
+ $ $P18E             : chr "0,0"
+ $ $P18N             : chr "BV480-A"
+ $ $P18R             : chr "4194304"
+ $ $P18S             : chr "CD161"
+ $ $P18TYPE          : chr "Unmixed_Fluorescence"
+ $ $P18V             : chr "0"
+ $ $P19B             : chr "32"
+ $ $P19E             : chr "0,0"
+ $ $P19N             : chr "BV570-A"
+ $ $P19R             : chr "4194304"
+ $ $P19S             : chr "CD16"
+ $ $P19TYPE          : chr "Unmixed_Fluorescence"
+ $ $P19V             : chr "0"
+ $ $P1B              : chr "32"
+ $ $P1E              : chr "0,0"
+ $ $P1N              : chr "Time"
+ $ $P1R              : chr "516839"
+ $ $P1TYPE           : chr "Time"
+ $ $P20B             : chr "32"
+ $ $P20E             : chr "0,0"
+ $ $P20N             : chr "BV605-A"
+ $ $P20R             : chr "4194304"
+ $ $P20S             : chr "CD45RA"
+ $ $P20TYPE          : chr "Unmixed_Fluorescence"
+  [list output truncated]
+
+
DescriptionList$`$SPILLOVER`
+
+
      BUV395-A BUV563-A BUV615-A BUV661-A BUV737-A BUV805-A Pacific Blue-A
+ [1,]    1e+00        0        0        0        0        0              0
+ [2,]    1e-06        1        0        0        0        0              0
+ [3,]    0e+00        0        1        0        0        0              0
+ [4,]    0e+00        0        0        1        0        0              0
+ [5,]    0e+00        0        0        0        1        0              0
+ [6,]    0e+00        0        0        0        0        1              0
+ [7,]    0e+00        0        0        0        0        0              1
+ [8,]    0e+00        0        0        0        0        0              0
+ [9,]    0e+00        0        0        0        0        0              0
+[10,]    0e+00        0        0        0        0        0              0
+[11,]    0e+00        0        0        0        0        0              0
+[12,]    0e+00        0        0        0        0        0              0
+[13,]    0e+00        0        0        0        0        0              0
+[14,]    0e+00        0        0        0        0        0              0
+[15,]    0e+00        0        0        0        0        0              0
+[16,]    0e+00        0        0        0        0        0              0
+[17,]    0e+00        0        0        0        0        0              0
+[18,]    0e+00        0        0        0        0        0              0
+[19,]    0e+00        0        0        0        0        0              0
+[20,]    0e+00        0        0        0        0        0              0
+[21,]    0e+00        0        0        0        0        0              0
+[22,]    0e+00        0        0        0        0        0              0
+[23,]    0e+00        0        0        0        0        0              0
+[24,]    0e+00        0        0        0        0        0              0
+[25,]    0e+00        0        0        0        0        0              0
+[26,]    0e+00        0        0        0        0        0              0
+[27,]    0e+00        0        0        0        0        0              0
+[28,]    0e+00        0        0        0        0        0              0
+[29,]    0e+00        0        0        0        0        0              0
+[30,]    0e+00        0        0        0        0        0              0
+[31,]    0e+00        0        0        0        0        0              0
+[32,]    0e+00        0        0        0        0        0              0
+[33,]    0e+00        0        0        0        0        0              0
+      BV480-A BV570-A BV605-A BV650-A BV711-A BV750-A BV786-A Alexa Fluor 488-A
+ [1,]       0       0       0       0       0       0       0                 0
+ [2,]       0       0       0       0       0       0       0                 0
+ [3,]       0       0       0       0       0       0       0                 0
+ [4,]       0       0       0       0       0       0       0                 0
+ [5,]       0       0       0       0       0       0       0                 0
+ [6,]       0       0       0       0       0       0       0                 0
+ [7,]       0       0       0       0       0       0       0                 0
+ [8,]       1       0       0       0       0       0       0                 0
+ [9,]       0       1       0       0       0       0       0                 0
+[10,]       0       0       1       0       0       0       0                 0
+[11,]       0       0       0       1       0       0       0                 0
+[12,]       0       0       0       0       1       0       0                 0
+[13,]       0       0       0       0       0       1       0                 0
+[14,]       0       0       0       0       0       0       1                 0
+[15,]       0       0       0       0       0       0       0                 1
+[16,]       0       0       0       0       0       0       0                 0
+[17,]       0       0       0       0       0       0       0                 0
+[18,]       0       0       0       0       0       0       0                 0
+[19,]       0       0       0       0       0       0       0                 0
+[20,]       0       0       0       0       0       0       0                 0
+[21,]       0       0       0       0       0       0       0                 0
+[22,]       0       0       0       0       0       0       0                 0
+[23,]       0       0       0       0       0       0       0                 0
+[24,]       0       0       0       0       0       0       0                 0
+[25,]       0       0       0       0       0       0       0                 0
+[26,]       0       0       0       0       0       0       0                 0
+[27,]       0       0       0       0       0       0       0                 0
+[28,]       0       0       0       0       0       0       0                 0
+[29,]       0       0       0       0       0       0       0                 0
+[30,]       0       0       0       0       0       0       0                 0
+[31,]       0       0       0       0       0       0       0                 0
+[32,]       0       0       0       0       0       0       0                 0
+[33,]       0       0       0       0       0       0       0                 0
+      Spark Blue 550-A Spark Blue 574-A RB613-A RB705-A RB780-A PE-A
+ [1,]                0                0       0       0       0    0
+ [2,]                0                0       0       0       0    0
+ [3,]                0                0       0       0       0    0
+ [4,]                0                0       0       0       0    0
+ [5,]                0                0       0       0       0    0
+ [6,]                0                0       0       0       0    0
+ [7,]                0                0       0       0       0    0
+ [8,]                0                0       0       0       0    0
+ [9,]                0                0       0       0       0    0
+[10,]                0                0       0       0       0    0
+[11,]                0                0       0       0       0    0
+[12,]                0                0       0       0       0    0
+[13,]                0                0       0       0       0    0
+[14,]                0                0       0       0       0    0
+[15,]                0                0       0       0       0    0
+[16,]                1                0       0       0       0    0
+[17,]                0                1       0       0       0    0
+[18,]                0                0       1       0       0    0
+[19,]                0                0       0       1       0    0
+[20,]                0                0       0       0       1    0
+[21,]                0                0       0       0       0    1
+[22,]                0                0       0       0       0    0
+[23,]                0                0       0       0       0    0
+[24,]                0                0       0       0       0    0
+[25,]                0                0       0       0       0    0
+[26,]                0                0       0       0       0    0
+[27,]                0                0       0       0       0    0
+[28,]                0                0       0       0       0    0
+[29,]                0                0       0       0       0    0
+[30,]                0                0       0       0       0    0
+[31,]                0                0       0       0       0    0
+[32,]                0                0       0       0       0    0
+[33,]                0                0       0       0       0    0
+      PE-Dazzle594-A PE-Cy5-A PE-Fire 700-A PE-Fire 744-A PE-Vio770-A APC-A
+ [1,]              0        0             0             0           0     0
+ [2,]              0        0             0             0           0     0
+ [3,]              0        0             0             0           0     0
+ [4,]              0        0             0             0           0     0
+ [5,]              0        0             0             0           0     0
+ [6,]              0        0             0             0           0     0
+ [7,]              0        0             0             0           0     0
+ [8,]              0        0             0             0           0     0
+ [9,]              0        0             0             0           0     0
+[10,]              0        0             0             0           0     0
+[11,]              0        0             0             0           0     0
+[12,]              0        0             0             0           0     0
+[13,]              0        0             0             0           0     0
+[14,]              0        0             0             0           0     0
+[15,]              0        0             0             0           0     0
+[16,]              0        0             0             0           0     0
+[17,]              0        0             0             0           0     0
+[18,]              0        0             0             0           0     0
+[19,]              0        0             0             0           0     0
+[20,]              0        0             0             0           0     0
+[21,]              0        0             0             0           0     0
+[22,]              1        0             0             0           0     0
+[23,]              0        1             0             0           0     0
+[24,]              0        0             1             0           0     0
+[25,]              0        0             0             1           0     0
+[26,]              0        0             0             0           1     0
+[27,]              0        0             0             0           0     1
+[28,]              0        0             0             0           0     0
+[29,]              0        0             0             0           0     0
+[30,]              0        0             0             0           0     0
+[31,]              0        0             0             0           0     0
+[32,]              0        0             0             0           0     0
+[33,]              0        0             0             0           0     0
+      Alexa Fluor 647-A APC-R700-A Zombie NIR-A APC-Fire 750-A APC-Fire 810-A
+ [1,]                 0          0            0              0              0
+ [2,]                 0          0            0              0              0
+ [3,]                 0          0            0              0              0
+ [4,]                 0          0            0              0              0
+ [5,]                 0          0            0              0              0
+ [6,]                 0          0            0              0              0
+ [7,]                 0          0            0              0              0
+ [8,]                 0          0            0              0              0
+ [9,]                 0          0            0              0              0
+[10,]                 0          0            0              0              0
+[11,]                 0          0            0              0              0
+[12,]                 0          0            0              0              0
+[13,]                 0          0            0              0              0
+[14,]                 0          0            0              0              0
+[15,]                 0          0            0              0              0
+[16,]                 0          0            0              0              0
+[17,]                 0          0            0              0              0
+[18,]                 0          0            0              0              0
+[19,]                 0          0            0              0              0
+[20,]                 0          0            0              0              0
+[21,]                 0          0            0              0              0
+[22,]                 0          0            0              0              0
+[23,]                 0          0            0              0              0
+[24,]                 0          0            0              0              0
+[25,]                 0          0            0              0              0
+[26,]                 0          0            0              0              0
+[27,]                 0          0            0              0              0
+[28,]                 1          0            0              0              0
+[29,]                 0          1            0              0              0
+[30,]                 0          0            1              0              0
+[31,]                 0          0            0              1              0
+[32,]                 0          0            0              0              1
+[33,]                 0          0            0              0              0
+      AF-A
+ [1,]    0
+ [2,]    0
+ [3,]    0
+ [4,]    0
+ [5,]    0
+ [6,]    0
+ [7,]    0
+ [8,]    0
+ [9,]    0
+[10,]    0
+[11,]    0
+[12,]    0
+[13,]    0
+[14,]    0
+[15,]    0
+[16,]    0
+[17,]    0
+[18,]    0
+[19,]    0
+[20,]    0
+[21,]    0
+[22,]    0
+[23,]    0
+[24,]    0
+[25,]    0
+[26,]    0
+[27,]    0
+[28,]    0
+[29,]    0
+[30,]    0
+[31,]    0
+[32,]    0
+[33,]    1
+
+
Subset <- DescriptionList[1:18]
+DescriptionList$`$BTIM`
+
+
[1] "21:30:10.27"
+
+
DescriptionList$`$CYT`
+
+
[1] "Aurora"
+
+
DescriptionList$`$CYTSN`
+
+
[1] "U1368"
+
+
DescriptionList$`$DATE`
+
+
[1] "26-Jul-2025"
+
+
DescriptionList$`$ETIM`
+
+
[1] "21:31:01.86"
+
+
DescriptionList$`$FIL`
+
+
[1] "Ctrl.fcs"
+
+
DescriptionList$`$OP`
+
+
[1] "David Rach"
+
+
Detectors <- DescriptionList[20:384]
+Detectors
+
+
$`$P10B`
+[1] "32"
+
+$`$P10E`
+[1] "0,0"
+
+$`$P10N`
+[1] "SSC-B-A"
+
+$`$P10R`
+[1] "4194304"
+
+$`$P10TYPE`
+[1] "Side_Scatter"
+
+$`$P10V`
+[1] "266"
+
+$`$P11B`
+[1] "32"
+
+$`$P11E`
+[1] "0,0"
+
+$`$P11N`
+[1] "BUV395-A"
+
+$`$P11R`
+[1] "4194304"
+
+$`$P11S`
+[1] "CD62L"
+
+$`$P11TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P11V`
+[1] "0"
+
+$`$P12B`
+[1] "32"
+
+$`$P12E`
+[1] "0,0"
+
+$`$P12N`
+[1] "BUV563-A"
+
+$`$P12R`
+[1] "4194304"
+
+$`$P12S`
+[1] "CD69"
+
+$`$P12TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P12V`
+[1] "0"
+
+$`$P13B`
+[1] "32"
+
+$`$P13E`
+[1] "0,0"
+
+$`$P13N`
+[1] "BUV615-A"
+
+$`$P13R`
+[1] "4194304"
+
+$`$P13S`
+[1] "CCR4"
+
+$`$P13TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P13V`
+[1] "0"
+
+$`$P14B`
+[1] "32"
+
+$`$P14E`
+[1] "0,0"
+
+$`$P14N`
+[1] "BUV661-A"
+
+$`$P14R`
+[1] "4194304"
+
+$`$P14S`
+[1] "Vd2"
+
+$`$P14TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P14V`
+[1] "0"
+
+$`$P15B`
+[1] "32"
+
+$`$P15E`
+[1] "0,0"
+
+$`$P15N`
+[1] "BUV737-A"
+
+$`$P15R`
+[1] "4194304"
+
+$`$P15S`
+[1] "CD38"
+
+$`$P15TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P15V`
+[1] "0"
+
+$`$P16B`
+[1] "32"
+
+$`$P16E`
+[1] "0,0"
+
+$`$P16N`
+[1] "BUV805-A"
+
+$`$P16R`
+[1] "4194304"
+
+$`$P16S`
+[1] "CD4"
+
+$`$P16TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P16V`
+[1] "0"
+
+$`$P17B`
+[1] "32"
+
+$`$P17E`
+[1] "0,0"
+
+$`$P17N`
+[1] "Pacific Blue-A"
+
+$`$P17R`
+[1] "4194304"
+
+$`$P17S`
+[1] "Dump"
+
+$`$P17TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P17V`
+[1] "0"
+
+$`$P18B`
+[1] "32"
+
+$`$P18E`
+[1] "0,0"
+
+$`$P18N`
+[1] "BV480-A"
+
+$`$P18R`
+[1] "4194304"
+
+$`$P18S`
+[1] "CD161"
+
+$`$P18TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P18V`
+[1] "0"
+
+$`$P19B`
+[1] "32"
+
+$`$P19E`
+[1] "0,0"
+
+$`$P19N`
+[1] "BV570-A"
+
+$`$P19R`
+[1] "4194304"
+
+$`$P19S`
+[1] "CD16"
+
+$`$P19TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P19V`
+[1] "0"
+
+$`$P1B`
+[1] "32"
+
+$`$P1E`
+[1] "0,0"
+
+$`$P1N`
+[1] "Time"
+
+$`$P1R`
+[1] "516839"
+
+$`$P1TYPE`
+[1] "Time"
+
+$`$P20B`
+[1] "32"
+
+$`$P20E`
+[1] "0,0"
+
+$`$P20N`
+[1] "BV605-A"
+
+$`$P20R`
+[1] "4194304"
+
+$`$P20S`
+[1] "CD45RA"
+
+$`$P20TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P20V`
+[1] "0"
+
+$`$P21B`
+[1] "32"
+
+$`$P21E`
+[1] "0,0"
+
+$`$P21N`
+[1] "BV650-A"
+
+$`$P21R`
+[1] "4194304"
+
+$`$P21S`
+[1] "CD8"
+
+$`$P21TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P21V`
+[1] "0"
+
+$`$P22B`
+[1] "32"
+
+$`$P22E`
+[1] "0,0"
+
+$`$P22N`
+[1] "BV711-A"
+
+$`$P22R`
+[1] "4194304"
+
+$`$P22S`
+[1] "Va7.2"
+
+$`$P22TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P22V`
+[1] "0"
+
+$`$P23B`
+[1] "32"
+
+$`$P23E`
+[1] "0,0"
+
+$`$P23N`
+[1] "BV750-A"
+
+$`$P23R`
+[1] "4194304"
+
+$`$P23S`
+[1] "IFNg"
+
+$`$P23TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P23V`
+[1] "0"
+
+$`$P24B`
+[1] "32"
+
+$`$P24E`
+[1] "0,0"
+
+$`$P24N`
+[1] "BV786-A"
+
+$`$P24R`
+[1] "4194304"
+
+$`$P24S`
+[1] "CCR6"
+
+$`$P24TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P24V`
+[1] "0"
+
+$`$P25B`
+[1] "32"
+
+$`$P25E`
+[1] "0,0"
+
+$`$P25N`
+[1] "Alexa Fluor 488-A"
+
+$`$P25R`
+[1] "4194304"
+
+$`$P25S`
+[1] "FoxP3"
+
+$`$P25TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P25V`
+[1] "0"
+
+$`$P26B`
+[1] "32"
+
+$`$P26E`
+[1] "0,0"
+
+$`$P26N`
+[1] "Spark Blue 550-A"
+
+$`$P26R`
+[1] "4194304"
+
+$`$P26S`
+[1] "CD3"
+
+$`$P26TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P26V`
+[1] "0"
+
+$`$P27B`
+[1] "32"
+
+$`$P27E`
+[1] "0,0"
+
+$`$P27N`
+[1] "Spark Blue 574-A"
+
+$`$P27R`
+[1] "4194304"
+
+$`$P27S`
+[1] "CD45"
+
+$`$P27TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P27V`
+[1] "0"
+
+$`$P28B`
+[1] "32"
+
+$`$P28E`
+[1] "0,0"
+
+$`$P28N`
+[1] "RB613-A"
+
+$`$P28R`
+[1] "4194304"
+
+$`$P28S`
+[1] "PD1"
+
+$`$P28TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P28V`
+[1] "0"
+
+$`$P29B`
+[1] "32"
+
+$`$P29E`
+[1] "0,0"
+
+$`$P29N`
+[1] "RB705-A"
+
+$`$P29R`
+[1] "4194304"
+
+$`$P29S`
+[1] "CD26"
+
+$`$P29TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P29V`
+[1] "0"
+
+$`$P2B`
+[1] "32"
+
+$`$P2E`
+[1] "0,0"
+
+$`$P2N`
+[1] "SSC-W"
+
+$`$P2R`
+[1] "4194304"
+
+$`$P2TYPE`
+[1] "Side_Scatter"
+
+$`$P2V`
+[1] "350"
+
+$`$P30B`
+[1] "32"
+
+$`$P30E`
+[1] "0,0"
+
+$`$P30N`
+[1] "RB780-A"
+
+$`$P30R`
+[1] "4194304"
+
+$`$P30S`
+[1] "CXCR5"
+
+$`$P30TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P30V`
+[1] "0"
+
+$`$P31B`
+[1] "32"
+
+$`$P31E`
+[1] "0,0"
+
+$`$P31N`
+[1] "PE-A"
+
+$`$P31R`
+[1] "4194304"
+
+$`$P31S`
+[1] "ICOS"
+
+$`$P31TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P31V`
+[1] "0"
+
+$`$P32B`
+[1] "32"
+
+$`$P32E`
+[1] "0,0"
+
+$`$P32N`
+[1] "PE-Dazzle594-A"
+
+$`$P32R`
+[1] "4194304"
+
+$`$P32S`
+[1] "TNFa"
+
+$`$P32TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P32V`
+[1] "0"
+
+$`$P33B`
+[1] "32"
+
+$`$P33E`
+[1] "0,0"
+
+$`$P33N`
+[1] "PE-Cy5-A"
+
+$`$P33R`
+[1] "4194304"
+
+$`$P33S`
+[1] "CXCR3"
+
+$`$P33TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P33V`
+[1] "0"
+
+$`$P34B`
+[1] "32"
+
+$`$P34E`
+[1] "0,0"
+
+$`$P34N`
+[1] "PE-Fire 700-A"
+
+$`$P34R`
+[1] "4194304"
+
+$`$P34S`
+[1] "CD127"
+
+$`$P34TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P34V`
+[1] "0"
+
+$`$P35B`
+[1] "32"
+
+$`$P35E`
+[1] "0,0"
+
+$`$P35N`
+[1] "PE-Fire 744-A"
+
+$`$P35R`
+[1] "4194304"
+
+$`$P35S`
+[1] "CD25"
+
+$`$P35TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P35V`
+[1] "0"
+
+$`$P36B`
+[1] "32"
+
+$`$P36E`
+[1] "0,0"
+
+$`$P36N`
+[1] "PE-Vio770-A"
+
+$`$P36R`
+[1] "4194304"
+
+$`$P36S`
+[1] "HLA-DR"
+
+$`$P36TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P36V`
+[1] "0"
+
+$`$P37B`
+[1] "32"
+
+$`$P37E`
+[1] "0,0"
+
+$`$P37N`
+[1] "APC-A"
+
+$`$P37R`
+[1] "4194304"
+
+$`$P37S`
+[1] "CD39"
+
+$`$P37TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P37V`
+[1] "0"
+
+$`$P38B`
+[1] "32"
+
+$`$P38E`
+[1] "0,0"
+
+$`$P38N`
+[1] "Alexa Fluor 647-A"
+
+$`$P38R`
+[1] "4194304"
+
+$`$P38S`
+[1] "IL-2"
+
+$`$P38TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P38V`
+[1] "0"
+
+$`$P39B`
+[1] "32"
+
+$`$P39E`
+[1] "0,0"
+
+$`$P39N`
+[1] "APC-R700-A"
+
+$`$P39R`
+[1] "4194304"
+
+$`$P39S`
+[1] "CD107a"
+
+$`$P39TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P39V`
+[1] "0"
+
+$`$P3B`
+[1] "32"
+
+$`$P3E`
+[1] "0,0"
+
+$`$P3N`
+[1] "SSC-H"
+
+$`$P3R`
+[1] "4194304"
+
+$`$P3TYPE`
+[1] "Side_Scatter"
+
+$`$P3V`
+[1] "350"
+
+$`$P40B`
+[1] "32"
+
+$`$P40E`
+[1] "0,0"
+
+$`$P40N`
+[1] "Zombie NIR-A"
+
+$`$P40R`
+[1] "4194304"
+
+$`$P40S`
+[1] "Viability"
+
+$`$P40TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P40V`
+[1] "0"
+
+$`$P41B`
+[1] "32"
+
+$`$P41E`
+[1] "0,0"
+
+$`$P41N`
+[1] "APC-Fire 750-A"
+
+$`$P41R`
+[1] "4194304"
+
+$`$P41S`
+[1] "CD27"
+
+$`$P41TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P41V`
+[1] "0"
+
+$`$P42B`
+[1] "32"
+
+$`$P42E`
+[1] "0,0"
+
+$`$P42N`
+[1] "APC-Fire 810-A"
+
+$`$P42R`
+[1] "4194304"
+
+$`$P42S`
+[1] "CCR7"
+
+$`$P42TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P42V`
+[1] "0"
+
+$`$P43B`
+[1] "32"
+
+$`$P43E`
+[1] "0,0"
+
+$`$P43N`
+[1] "AF-A"
+
+$`$P43R`
+[1] "4194304"
+
+$`$P43TYPE`
+[1] "Unmixed_Fluorescence"
+
+$`$P43V`
+[1] "0"
+
+$`$P4B`
+[1] "32"
+
+$`$P4E`
+[1] "0,0"
+
+$`$P4N`
+[1] "SSC-A"
+
+$`$P4R`
+[1] "4194304"
+
+$`$P4TYPE`
+[1] "Side_Scatter"
+
+$`$P4V`
+[1] "350"
+
+$`$P5B`
+[1] "32"
+
+$`$P5E`
+[1] "0,0"
+
+$`$P5N`
+[1] "FSC-W"
+
+$`$P5R`
+[1] "4194304"
+
+$`$P5TYPE`
+[1] "Forward_Scatter"
+
+$`$P5V`
+[1] "64"
+
+$`$P6B`
+[1] "32"
+
+$`$P6E`
+[1] "0,0"
+
+$`$P6N`
+[1] "FSC-H"
+
+$`$P6R`
+[1] "4194304"
+
+$`$P6TYPE`
+[1] "Forward_Scatter"
+
+$`$P6V`
+[1] "64"
+
+$`$P7B`
+[1] "32"
+
+$`$P7E`
+[1] "0,0"
+
+$`$P7N`
+[1] "FSC-A"
+
+$`$P7R`
+[1] "4194304"
+
+$`$P7TYPE`
+[1] "Forward_Scatter"
+
+$`$P7V`
+[1] "64"
+
+$`$P8B`
+[1] "32"
+
+$`$P8E`
+[1] "0,0"
+
+$`$P8N`
+[1] "SSC-B-W"
+
+$`$P8R`
+[1] "4194304"
+
+$`$P8TYPE`
+[1] "Side_Scatter"
+
+$`$P8V`
+[1] "266"
+
+$`$P9B`
+[1] "32"
+
+$`$P9E`
+[1] "0,0"
+
+$`$P9N`
+[1] "SSC-B-H"
+
+$`$P9R`
+[1] "4194304"
+
+$`$P9TYPE`
+[1] "Side_Scatter"
+
+$`$P9V`
+[1] "266"
+
+$`$PAR`
+[1] "43"
+
+$`$PROJ`
+[1] "2025_07_26_AB_02"
+
+$`$SPILLOVER`
+      BUV395-A BUV563-A BUV615-A BUV661-A BUV737-A BUV805-A Pacific Blue-A
+ [1,]    1e+00        0        0        0        0        0              0
+ [2,]    1e-06        1        0        0        0        0              0
+ [3,]    0e+00        0        1        0        0        0              0
+ [4,]    0e+00        0        0        1        0        0              0
+ [5,]    0e+00        0        0        0        1        0              0
+ [6,]    0e+00        0        0        0        0        1              0
+ [7,]    0e+00        0        0        0        0        0              1
+ [8,]    0e+00        0        0        0        0        0              0
+ [9,]    0e+00        0        0        0        0        0              0
+[10,]    0e+00        0        0        0        0        0              0
+[11,]    0e+00        0        0        0        0        0              0
+[12,]    0e+00        0        0        0        0        0              0
+[13,]    0e+00        0        0        0        0        0              0
+[14,]    0e+00        0        0        0        0        0              0
+[15,]    0e+00        0        0        0        0        0              0
+[16,]    0e+00        0        0        0        0        0              0
+[17,]    0e+00        0        0        0        0        0              0
+[18,]    0e+00        0        0        0        0        0              0
+[19,]    0e+00        0        0        0        0        0              0
+[20,]    0e+00        0        0        0        0        0              0
+[21,]    0e+00        0        0        0        0        0              0
+[22,]    0e+00        0        0        0        0        0              0
+[23,]    0e+00        0        0        0        0        0              0
+[24,]    0e+00        0        0        0        0        0              0
+[25,]    0e+00        0        0        0        0        0              0
+[26,]    0e+00        0        0        0        0        0              0
+[27,]    0e+00        0        0        0        0        0              0
+[28,]    0e+00        0        0        0        0        0              0
+[29,]    0e+00        0        0        0        0        0              0
+[30,]    0e+00        0        0        0        0        0              0
+[31,]    0e+00        0        0        0        0        0              0
+[32,]    0e+00        0        0        0        0        0              0
+[33,]    0e+00        0        0        0        0        0              0
+      BV480-A BV570-A BV605-A BV650-A BV711-A BV750-A BV786-A Alexa Fluor 488-A
+ [1,]       0       0       0       0       0       0       0                 0
+ [2,]       0       0       0       0       0       0       0                 0
+ [3,]       0       0       0       0       0       0       0                 0
+ [4,]       0       0       0       0       0       0       0                 0
+ [5,]       0       0       0       0       0       0       0                 0
+ [6,]       0       0       0       0       0       0       0                 0
+ [7,]       0       0       0       0       0       0       0                 0
+ [8,]       1       0       0       0       0       0       0                 0
+ [9,]       0       1       0       0       0       0       0                 0
+[10,]       0       0       1       0       0       0       0                 0
+[11,]       0       0       0       1       0       0       0                 0
+[12,]       0       0       0       0       1       0       0                 0
+[13,]       0       0       0       0       0       1       0                 0
+[14,]       0       0       0       0       0       0       1                 0
+[15,]       0       0       0       0       0       0       0                 1
+[16,]       0       0       0       0       0       0       0                 0
+[17,]       0       0       0       0       0       0       0                 0
+[18,]       0       0       0       0       0       0       0                 0
+[19,]       0       0       0       0       0       0       0                 0
+[20,]       0       0       0       0       0       0       0                 0
+[21,]       0       0       0       0       0       0       0                 0
+[22,]       0       0       0       0       0       0       0                 0
+[23,]       0       0       0       0       0       0       0                 0
+[24,]       0       0       0       0       0       0       0                 0
+[25,]       0       0       0       0       0       0       0                 0
+[26,]       0       0       0       0       0       0       0                 0
+[27,]       0       0       0       0       0       0       0                 0
+[28,]       0       0       0       0       0       0       0                 0
+[29,]       0       0       0       0       0       0       0                 0
+[30,]       0       0       0       0       0       0       0                 0
+[31,]       0       0       0       0       0       0       0                 0
+[32,]       0       0       0       0       0       0       0                 0
+[33,]       0       0       0       0       0       0       0                 0
+      Spark Blue 550-A Spark Blue 574-A RB613-A RB705-A RB780-A PE-A
+ [1,]                0                0       0       0       0    0
+ [2,]                0                0       0       0       0    0
+ [3,]                0                0       0       0       0    0
+ [4,]                0                0       0       0       0    0
+ [5,]                0                0       0       0       0    0
+ [6,]                0                0       0       0       0    0
+ [7,]                0                0       0       0       0    0
+ [8,]                0                0       0       0       0    0
+ [9,]                0                0       0       0       0    0
+[10,]                0                0       0       0       0    0
+[11,]                0                0       0       0       0    0
+[12,]                0                0       0       0       0    0
+[13,]                0                0       0       0       0    0
+[14,]                0                0       0       0       0    0
+[15,]                0                0       0       0       0    0
+[16,]                1                0       0       0       0    0
+[17,]                0                1       0       0       0    0
+[18,]                0                0       1       0       0    0
+[19,]                0                0       0       1       0    0
+[20,]                0                0       0       0       1    0
+[21,]                0                0       0       0       0    1
+[22,]                0                0       0       0       0    0
+[23,]                0                0       0       0       0    0
+[24,]                0                0       0       0       0    0
+[25,]                0                0       0       0       0    0
+[26,]                0                0       0       0       0    0
+[27,]                0                0       0       0       0    0
+[28,]                0                0       0       0       0    0
+[29,]                0                0       0       0       0    0
+[30,]                0                0       0       0       0    0
+[31,]                0                0       0       0       0    0
+[32,]                0                0       0       0       0    0
+[33,]                0                0       0       0       0    0
+      PE-Dazzle594-A PE-Cy5-A PE-Fire 700-A PE-Fire 744-A PE-Vio770-A APC-A
+ [1,]              0        0             0             0           0     0
+ [2,]              0        0             0             0           0     0
+ [3,]              0        0             0             0           0     0
+ [4,]              0        0             0             0           0     0
+ [5,]              0        0             0             0           0     0
+ [6,]              0        0             0             0           0     0
+ [7,]              0        0             0             0           0     0
+ [8,]              0        0             0             0           0     0
+ [9,]              0        0             0             0           0     0
+[10,]              0        0             0             0           0     0
+[11,]              0        0             0             0           0     0
+[12,]              0        0             0             0           0     0
+[13,]              0        0             0             0           0     0
+[14,]              0        0             0             0           0     0
+[15,]              0        0             0             0           0     0
+[16,]              0        0             0             0           0     0
+[17,]              0        0             0             0           0     0
+[18,]              0        0             0             0           0     0
+[19,]              0        0             0             0           0     0
+[20,]              0        0             0             0           0     0
+[21,]              0        0             0             0           0     0
+[22,]              1        0             0             0           0     0
+[23,]              0        1             0             0           0     0
+[24,]              0        0             1             0           0     0
+[25,]              0        0             0             1           0     0
+[26,]              0        0             0             0           1     0
+[27,]              0        0             0             0           0     1
+[28,]              0        0             0             0           0     0
+[29,]              0        0             0             0           0     0
+[30,]              0        0             0             0           0     0
+[31,]              0        0             0             0           0     0
+[32,]              0        0             0             0           0     0
+[33,]              0        0             0             0           0     0
+      Alexa Fluor 647-A APC-R700-A Zombie NIR-A APC-Fire 750-A APC-Fire 810-A
+ [1,]                 0          0            0              0              0
+ [2,]                 0          0            0              0              0
+ [3,]                 0          0            0              0              0
+ [4,]                 0          0            0              0              0
+ [5,]                 0          0            0              0              0
+ [6,]                 0          0            0              0              0
+ [7,]                 0          0            0              0              0
+ [8,]                 0          0            0              0              0
+ [9,]                 0          0            0              0              0
+[10,]                 0          0            0              0              0
+[11,]                 0          0            0              0              0
+[12,]                 0          0            0              0              0
+[13,]                 0          0            0              0              0
+[14,]                 0          0            0              0              0
+[15,]                 0          0            0              0              0
+[16,]                 0          0            0              0              0
+[17,]                 0          0            0              0              0
+[18,]                 0          0            0              0              0
+[19,]                 0          0            0              0              0
+[20,]                 0          0            0              0              0
+[21,]                 0          0            0              0              0
+[22,]                 0          0            0              0              0
+[23,]                 0          0            0              0              0
+[24,]                 0          0            0              0              0
+[25,]                 0          0            0              0              0
+[26,]                 0          0            0              0              0
+[27,]                 0          0            0              0              0
+[28,]                 1          0            0              0              0
+[29,]                 0          1            0              0              0
+[30,]                 0          0            1              0              0
+[31,]                 0          0            0              1              0
+[32,]                 0          0            0              0              1
+[33,]                 0          0            0              0              0
+      AF-A
+ [1,]    0
+ [2,]    0
+ [3,]    0
+ [4,]    0
+ [5,]    0
+ [6,]    0
+ [7,]    0
+ [8,]    0
+ [9,]    0
+[10,]    0
+[11,]    0
+[12,]    0
+[13,]    0
+[14,]    0
+[15,]    0
+[16,]    0
+[17,]    0
+[18,]    0
+[19,]    0
+[20,]    0
+[21,]    0
+[22,]    0
+[23,]    0
+[24,]    0
+[25,]    0
+[26,]    0
+[27,]    0
+[28,]    0
+[29,]    0
+[30,]    0
+[31,]    0
+[32,]    0
+[33,]    1
+
+$`$TIMESTEP`
+[1] "0.0001"
+
+$`$TOT`
+[1] "100"
+
+$`$VOL`
+[1] "60.66"
+
+$`APPLY COMPENSATION`
+[1] "FALSE"
+
+$CHARSET
+[1] "utf-8"
+
+$CREATOR
+[1] "SpectroFlo 3.3.0"
+
+$FCSversion
+[1] "3"
+
+$FILENAME
+[1] "data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+$`flowCore_$P10Rmax`
+[1] "4194303"
+
+$`flowCore_$P10Rmin`
+[1] "0"
+
+$`flowCore_$P11Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P11Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P12Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P12Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P13Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P13Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P14Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P14Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P15Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P15Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P16Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P16Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P17Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P17Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P18Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P18Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P19Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P19Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P1Rmax`
+[1] "506.501251220703"
+
+$`flowCore_$P1Rmin`
+[1] "0"
+
+$`flowCore_$P20Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P20Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P21Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P21Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P22Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P22Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P23Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P23Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P24Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P24Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P25Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P25Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P26Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P26Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P27Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P27Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P28Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P28Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P29Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P29Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P2Rmax`
+[1] "4194303"
+
+$`flowCore_$P2Rmin`
+[1] "0"
+
+$`flowCore_$P30Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P30Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P31Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P31Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P32Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P32Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P33Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P33Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P34Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P34Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P35Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P35Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P36Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P36Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P37Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P37Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P38Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P38Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P39Rmax`
+[1] "4192505.75"
+
+$`flowCore_$P39Rmin`
+[1] "-111.00008392334"
+
+$`flowCore_$P3Rmax`
+[1] "4194303"
+
+
DescriptionList$`$P7B`
+
+
[1] "32"
+
+
DescriptionList$`$P7E`
+
+
[1] "0,0"
+
+
DescriptionList$`$P7N`
+
+
[1] "FSC-A"
+
+
DescriptionList$`$P7R`
+
+
[1] "4194304"
+
+
DescriptionList$`$P7TYPE`
+
+
[1] "Forward_Scatter"
+
+
DescriptionList$`$P7V`
+
+
[1] "64"
+
+
# keyword(flowFrame)
+
+
+
+

Differences with raw file

+
    +
  • Instead of raw channel names such as “UV1-A”, “UV2-A” etc., there are fluorophore names such as “BUV395-A”.
  • +
  • There are 43 columns instead of 61, indicating that raw channels have been removed and only unmixed channels remain in the data file. +
      +
    • \(`\)PAR` keyword is 43 in this file vs 61 in raw file
    • +
  • +
  • There is now a “TYPE” keyword added: +
      +
    • e.g. \(`\)P40TYPE` that gives a value of “Unmixed_fluorescence”
    • +
  • +
  • There are marker names such as “CD107a” in the desc column.
  • +
  • “$transformation” keyword now has “custom” value
  • +
+
+
+

Problem 2

+

Today’s files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22…). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc)

+
+
PathToDataFolder <- file.path("data/AdditionalFCSFiles")
+PathToDataFolder
+
+
[1] "data/AdditionalFCSFiles"
+
+
# Locate .fcs files
+fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE)
+fcs_files
+
+
[1] "data/AdditionalFCSFiles/2025-10_22_Contrad.fcs"            
+[2] "data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs"
+
+
# Locate unmixed .fcs file
+conventional_file <- list.files(PathToDataFolder, pattern="2025-10_22", full.names=TRUE)
+conventional_file
+
+
[1] "data/AdditionalFCSFiles/2025-10_22_Contrad.fcs"
+
+
# Read unmixed .fcs file
+library(flowCore)
+read.FCS(filename=conventional_file)
+
+
flowFrame object '5855c3b6-7adc-45da-8921-191c97c559f5'
+with 1852 cells and 33 observables:
+       name   desc     range  minRange  maxRange
+$P1    Time     NA    262144       0.0    262143
+$P2   FSC-A     NA    262144       0.0    262143
+$P3   FSC-H     NA    262144       0.0    262143
+$P4   FSC-W     NA    262144       0.0    262143
+$P5   SSC-A     NA    262144     -44.8    262143
+...     ...    ...       ...       ...       ...
+$P29 Y615-H     NA    262144      0.00    262143
+$P30 Y710-A     NA    262144   -111.00    262143
+$P31 Y710-H     NA    262144      0.00    262143
+$P32 Y780-A     NA    262144    -87.33    262143
+$P33 Y780-H     NA    262144      0.00    262143
+397 keywords are stored in the 'description' slot
+
+
flowFrame <- read.FCS(filename=conventional_file, transformation = TRUE, truncate_max_range = FALSE)
+class(flowFrame)
+
+
[1] "flowFrame"
+attr(,"package")
+[1] "flowCore"
+
+
MFI_Matrix <- flowFrame@exprs
+ColumnNames <- colnames(MFI_Matrix)
+class(ColumnNames)
+
+
[1] "character"
+
+
# Explore parameters
+ParameterData <- flowFrame@parameters@data
+str(ParameterData)
+
+
'data.frame':   33 obs. of  5 variables:
+ $ name    : 'AsIs' Named chr  "Time" "FSC-A" "FSC-H" "FSC-W" ...
+  ..- attr(*, "names")= chr [1:33] "$P1N" "$P2N" "$P3N" "$P4N" ...
+ $ desc    : 'AsIs' Named chr  NA NA NA NA ...
+  ..- attr(*, "names")= chr [1:33] NA NA NA NA ...
+ $ range   : num  262144 262144 262144 262144 262144 ...
+ $ minRange: num  0 0 0 0 -44.8 ...
+ $ maxRange: num  262143 262143 262143 262143 262143 ...
+
+
# Explore Description
+DescriptionList <- flowFrame@description
+class(DescriptionList)
+
+
[1] "list"
+
+
str(DescriptionList)
+
+
List of 397
+ $ FCSversion        : chr "3"
+ $ $BEGINANALYSIS    : chr "0"
+ $ $ENDANALYSIS      : chr "0"
+ $ $BEGINSTEXT       : chr "0"
+ $ $ENDSTEXT         : chr "0"
+ $ $BEGINDATA        : chr "4378"
+ $ $ENDDATA          : chr "248841             "
+ $ $FIL              : chr "44633.fcs"
+ $ $SYS              : chr "Windows 7 6.1"
+ $ $TOT              : chr "1852               "
+ $ $PAR              : chr "33"
+ $ $MODE             : chr "L"
+ $ $BYTEORD          : chr "4,3,2,1"
+ $ $DATATYPE         : chr "F"
+ $ $NEXTDATA         : chr "0"
+ $ CREATOR           : chr "BD FACSDiva Software Version 8.0.2"
+ $ TUBE NAME         : chr "WE_22_DR_00"
+ $ $SRC              : chr "2025-10"
+ $ EXPERIMENT NAME   : chr "QC_2025-10"
+ $ GUID              : chr "5855c3b6-7adc-45da-8921-191c97c559f5"
+ $ $DATE             : chr "22-OCT-2025"
+ $ $BTIM             : chr "08:44:52"
+ $ $ETIM             : chr "09:16:22"
+ $ SETTINGS          : chr "Cytometer"
+ $ WINDOW EXTENSION  : chr "0.00"
+ $ EXPORT USER NAME  : chr "Administrator"
+ $ EXPORT TIME       : chr "22-OCT-2025-08:44:51"
+ $ FSC ASF           : chr "0.77"
+ $ AUTOBS            : chr "TRUE"
+ $ $INST             : chr " "
+ $ $TIMESTEP         : chr "0.01"
+ $ SPILL             : num [1:13, 1:13] 1 0 0 0 0 0 0 0 0 0 ...
+  ..- attr(*, "dimnames")=List of 2
+  .. ..$ : NULL
+  .. ..$ : chr [1:13] "R670-A" "R730-A" "R780-A" "B530-A" ...
+ $ APPLY COMPENSATION: chr "TRUE"
+ $ THRESHOLD         : chr "FSC,10000"
+ $ $P1N              : chr "Time"
+ $ $P1R              : chr "262144"
+ $ $P1B              : chr "32"
+ $ $P1E              : chr "0,0"
+ $ $P1G              : chr "0.01"
+ $ P1BS              : chr "0"
+ $ P1MS              : chr "0"
+ $ $P2N              : chr "FSC-A"
+ $ $P2R              : chr "262144"
+ $ $P2B              : chr "32"
+ $ $P2E              : chr "0,0"
+ $ $P2V              : chr "600"
+ $ $P2G              : chr "1.0"
+ $ P2DISPLAY         : chr "LIN"
+ $ P2BS              : chr "0"
+ $ P2MS              : chr "0"
+ $ $P3N              : chr "FSC-H"
+ $ $P3R              : chr "262144"
+ $ $P3B              : chr "32"
+ $ $P3E              : chr "0,0"
+ $ $P3V              : chr "600"
+ $ $P3G              : chr "1.0"
+ $ P3DISPLAY         : chr "LIN"
+ $ P3BS              : chr "0"
+ $ P3MS              : chr "0"
+ $ $P4N              : chr "FSC-W"
+ $ $P4R              : chr "262144"
+ $ $P4B              : chr "32"
+ $ $P4E              : chr "0,0"
+ $ $P4V              : chr "600"
+ $ $P4G              : chr "1.0"
+ $ P4BS              : chr "-1"
+ $ P4MS              : chr "0"
+ $ $P5N              : chr "SSC-A"
+ $ $P5R              : chr "262144"
+ $ $P5B              : chr "32"
+ $ $P5E              : chr "0,0"
+ $ $P5V              : chr "280"
+ $ $P5G              : chr "1.0"
+ $ P5DISPLAY         : chr "LIN"
+ $ P5BS              : chr "0"
+ $ P5MS              : chr "0"
+ $ $P6N              : chr "SSC-H"
+ $ $P6R              : chr "262144"
+ $ $P6B              : chr "32"
+ $ $P6E              : chr "0,0"
+ $ $P6V              : chr "280"
+ $ $P6G              : chr "1.0"
+ $ P6DISPLAY         : chr "LIN"
+ $ P6BS              : chr "0"
+ $ P6MS              : chr "0"
+ $ $P7N              : chr "SSC-W"
+ $ $P7R              : chr "262144"
+ $ $P7B              : chr "32"
+ $ $P7E              : chr "0,0"
+ $ $P7V              : chr "280"
+ $ $P7G              : chr "1.0"
+ $ P7BS              : chr "-1"
+ $ P7MS              : chr "0"
+ $ $P8N              : chr "R670-A"
+ $ $P8R              : chr "262144"
+ $ $P8B              : chr "32"
+ $ $P8E              : chr "0,0"
+ $ $P8V              : chr "511"
+ $ $P8G              : chr "1.0"
+  [list output truncated]
+
+
DescriptionList$SPILL
+
+
      R670-A R730-A R780-A B530-A B710-A V450-A V525-A V610-A V670-A Y590-A
+ [1,]      1      0      0      0      0      0      0      0      0      0
+ [2,]      0      1      0      0      0      0      0      0      0      0
+ [3,]      0      0      1      0      0      0      0      0      0      0
+ [4,]      0      0      0      1      0      0      0      0      0      0
+ [5,]      0      0      0      0      1      0      0      0      0      0
+ [6,]      0      0      0      0      0      1      0      0      0      0
+ [7,]      0      0      0      0      0      0      1      0      0      0
+ [8,]      0      0      0      0      0      0      0      1      0      0
+ [9,]      0      0      0      0      0      0      0      0      1      0
+[10,]      0      0      0      0      0      0      0      0      0      1
+[11,]      0      0      0      0      0      0      0      0      0      0
+[12,]      0      0      0      0      0      0      0      0      0      0
+[13,]      0      0      0      0      0      0      0      0      0      0
+      Y615-A Y710-A Y780-A
+ [1,]      0      0      0
+ [2,]      0      0      0
+ [3,]      0      0      0
+ [4,]      0      0      0
+ [5,]      0      0      0
+ [6,]      0      0      0
+ [7,]      0      0      0
+ [8,]      0      0      0
+ [9,]      0      0      0
+[10,]      0      0      0
+[11,]      1      0      0
+[12,]      0      1      0
+[13,]      0      0      1
+
+
# keyword(flowFrame)
+
+
+
+

Differences in conventional file

+
    +
  • Channel names show both area and height parameters
  • +
  • There are 33 columns, i.e. 33 parameters
  • +
  • There is an “APPLY COMPENSATION” keyword that has the value “TRUE”
  • +
  • “CREATOR” keyword indicates an old cytometer using FACSDiva 8.0.2
  • +
  • “$SYS” keyword indicates old PC running Windows 7.6.1
  • +
  • The parameter keywords for each parameter have 7 variations instead of 6 in spectral file
  • +
  • “SPILL” keyword displays compensation matrix vs “$SPILLOVER” keyword in Aurora data
  • +
+
+
+

Problem 3

+

If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using Floreada.io.

+

+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.qmd b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.qmd new file mode 100644 index 0000000..22814bb --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework.qmd @@ -0,0 +1,116 @@ +# Problem 1 +Today’s walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26…). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc. + + +# Problem 1 Code +```{r} +PathToDataFolder <- file.path("data/AdditionalFCSFiles") +PathToDataFolder + +# Locate .fcs files +fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) +fcs_files + +# Locate unmixed .fcs file +unmixed_file <- list.files(PathToDataFolder, pattern="2025_07_26", full.names=TRUE) +unmixed_file + +# Read unmixed .fcs file +library(flowCore) +read.FCS(filename=unmixed_file) +flowFrame <- read.FCS(filename=unmixed_file, transformation = TRUE, truncate_max_range = FALSE) +class(flowFrame) +MFI_Matrix <- flowFrame@exprs +ColumnNames <- colnames(MFI_Matrix) +class(ColumnNames) + +# Explore parameters +ParameterData <- flowFrame@parameters@data +str(ParameterData) + +# Explore Description +DescriptionList <- flowFrame@description +DescriptionList +class(DescriptionList) +str(DescriptionList) +DescriptionList$`$SPILLOVER` +Subset <- DescriptionList[1:18] +DescriptionList$`$BTIM` +DescriptionList$`$CYT` +DescriptionList$`$CYTSN` +DescriptionList$`$DATE` +DescriptionList$`$ETIM` +DescriptionList$`$FIL` +DescriptionList$`$OP` +Detectors <- DescriptionList[20:384] +Detectors +DescriptionList$`$P7B` +DescriptionList$`$P7E` +DescriptionList$`$P7N` +DescriptionList$`$P7R` +DescriptionList$`$P7TYPE` +DescriptionList$`$P7V` +# keyword(flowFrame) +``` + +# Differences with raw file +- Instead of raw channel names such as "UV1-A", "UV2-A" etc., there are fluorophore names such as "BUV395-A". +- There are 43 columns instead of 61, indicating that raw channels have been removed and only unmixed channels remain in the data file. + - $`$PAR` keyword is 43 in this file vs 61 in raw file +- There is now a "TYPE" keyword added: + - e.g. $`$P40TYPE` that gives a value of "Unmixed_fluorescence" +- There are marker names such as "CD107a" in the desc column. +- "$transformation" keyword now has "custom" value + +# Problem 2 +Today’s files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22…). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc) + + +```{r} +PathToDataFolder <- file.path("data/AdditionalFCSFiles") +PathToDataFolder + +# Locate .fcs files +fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) +fcs_files + +# Locate unmixed .fcs file +conventional_file <- list.files(PathToDataFolder, pattern="2025-10_22", full.names=TRUE) +conventional_file + +# Read unmixed .fcs file +library(flowCore) +read.FCS(filename=conventional_file) +flowFrame <- read.FCS(filename=conventional_file, transformation = TRUE, truncate_max_range = FALSE) +class(flowFrame) +MFI_Matrix <- flowFrame@exprs +ColumnNames <- colnames(MFI_Matrix) +class(ColumnNames) + +# Explore parameters +ParameterData <- flowFrame@parameters@data +str(ParameterData) + +# Explore Description +DescriptionList <- flowFrame@description +class(DescriptionList) +str(DescriptionList) +DescriptionList$SPILL +# keyword(flowFrame) +``` + +# Differences in conventional file +- Channel names show both area and height parameters +- There are 33 columns, i.e. 33 parameters +- There is an "APPLY COMPENSATION" keyword that has the value "TRUE" +- "CREATOR" keyword indicates an old cytometer using FACSDiva 8.0.2 +- "$SYS" keyword indicates old PC running Windows 7.6.1 +- The parameter keywords for each parameter have 7 variations instead of 6 in spectral file +- "SPILL" keyword displays compensation matrix vs "$SPILLOVER" keyword in Aurora data + + +# Problem 3 +If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using Floreada.io. + +![](images/Problem3_1.png) +![](images/Problem3_2.png) diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css new file mode 100644 index 0000000..29be797 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-9e3ffae467580fdb927a41352e75a2e0.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: rgb(5.2, 44, 101.2);--bs-secondary-text-emphasis: rgb(43.2, 46.8, 50);--bs-success-text-emphasis: rgb(10, 54, 33.6);--bs-info-text-emphasis: rgb(5.2, 80.8, 96);--bs-warning-text-emphasis: rgb(102, 77.2, 2.8);--bs-danger-text-emphasis: rgb(88, 21.2, 27.6);--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: rgb(206.6, 226, 254.6);--bs-secondary-bg-subtle: rgb(225.6, 227.4, 229);--bs-success-bg-subtle: rgb(209, 231, 220.8);--bs-info-bg-subtle: rgb(206.6, 244.4, 252);--bs-warning-bg-subtle: rgb(255, 242.6, 205.4);--bs-danger-bg-subtle: rgb(248, 214.6, 217.8);--bs-light-bg-subtle: rgb(251.5, 252, 252.5);--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: rgb(158.2, 197, 254.2);--bs-secondary-border-subtle: rgb(196.2, 199.8, 203);--bs-success-border-subtle: rgb(163, 207, 186.6);--bs-info-border-subtle: rgb(158.2, 233.8, 249);--bs-warning-border-subtle: rgb(255, 230.2, 155.8);--bs-danger-border-subtle: rgb(241, 174.2, 180.6);--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: rgb(10.4, 88, 202.4);--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: rgb(255, 242.6, 205.4);--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: rgb(221.7, 222.3, 222.9);--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: rgb(42.5, 47.5, 52.5);--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: rgb(109.8, 168, 253.8);--bs-secondary-text-emphasis: rgb(166.8, 172.2, 177);--bs-success-text-emphasis: rgb(117, 183, 152.4);--bs-info-text-emphasis: rgb(109.8, 223.2, 246);--bs-warning-text-emphasis: rgb(255, 217.8, 106.2);--bs-danger-text-emphasis: rgb(234, 133.8, 143.4);--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: rgb(2.6, 22, 50.6);--bs-secondary-bg-subtle: rgb(21.6, 23.4, 25);--bs-success-bg-subtle: rgb(5, 27, 16.8);--bs-info-bg-subtle: rgb(2.6, 40.4, 48);--bs-warning-bg-subtle: rgb(51, 38.6, 1.4);--bs-danger-bg-subtle: rgb(44, 10.6, 13.8);--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: rgb(7.8, 66, 151.8);--bs-secondary-border-subtle: rgb(64.8, 70.2, 75);--bs-success-border-subtle: rgb(15, 81, 50.4);--bs-info-border-subtle: rgb(7.8, 121.2, 144);--bs-warning-border-subtle: rgb(153, 115.8, 4.2);--bs-danger-border-subtle: rgb(132, 31.8, 41.4);--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: rgb(109.8, 168, 253.8);--bs-link-hover-color: rgb(138.84, 185.4, 254.04);--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: rgb(117, 183, 152.4);--bs-form-valid-border-color: rgb(117, 183, 152.4);--bs-form-invalid-color: rgb(234, 133.8, 143.4);--bs-form-invalid-border-color: rgb(234, 133.8, 143.4)}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, rgb(221.7, 222.3, 222.9));border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}body.quarto-light .dark-content{display:none !important}body.quarto-dark .light-content{display:none !important}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: rgb(221.7, 222.3, 222.9);--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: rgb(206.6, 226, 254.6);--bs-table-border-color: rgb(185.94, 203.4, 229.14);--bs-table-striped-bg: rgb(196.27, 214.7, 241.87);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(185.94, 203.4, 229.14);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(191.105, 209.05, 235.505);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: rgb(225.6, 227.4, 229);--bs-table-border-color: rgb(203.04, 204.66, 206.1);--bs-table-striped-bg: rgb(214.32, 216.03, 217.55);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(203.04, 204.66, 206.1);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(208.68, 210.345, 211.825);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: rgb(209, 231, 220.8);--bs-table-border-color: rgb(188.1, 207.9, 198.72);--bs-table-striped-bg: rgb(198.55, 219.45, 209.76);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(188.1, 207.9, 198.72);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(193.325, 213.675, 204.24);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: rgb(206.6, 244.4, 252);--bs-table-border-color: rgb(185.94, 219.96, 226.8);--bs-table-striped-bg: rgb(196.27, 232.18, 239.4);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(185.94, 219.96, 226.8);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(191.105, 226.07, 233.1);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: rgb(255, 242.6, 205.4);--bs-table-border-color: rgb(229.5, 218.34, 184.86);--bs-table-striped-bg: rgb(242.25, 230.47, 195.13);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(229.5, 218.34, 184.86);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(235.875, 224.405, 189.995);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: rgb(248, 214.6, 217.8);--bs-table-border-color: rgb(223.2, 193.14, 196.02);--bs-table-striped-bg: rgb(235.6, 203.87, 206.91);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 193.14, 196.02);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 198.505, 201.465);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: rgb(223.2, 224.1, 225);--bs-table-striped-bg: rgb(235.6, 236.55, 237.5);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(223.2, 224.1, 225);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(229.4, 230.325, 231.25);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: rgb(55.2, 58.8, 62.4);--bs-table-striped-bg: rgb(44.1, 47.9, 51.7);--bs-table-striped-color: #ffffff;--bs-table-active-bg: rgb(55.2, 58.8, 62.4);--bs-table-active-color: #ffffff;--bs-table-hover-bg: rgb(49.65, 53.35, 57.05);--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgb(221.7,222.3,222.9);print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:rgb(134,182.5,254);outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:rgb(182.4,211.5,254.4)}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:rgb(182.4,211.5,254.4)}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid rgb(221.7,222.3,222.9);border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(226.95, 230.35, 233.75);--bs-btn-hover-border-color: rgb(225.3, 228.9, 232.5);--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(228.6, 231.8, 235);--bs-btn-active-border-color: rgb(225.3, 228.9, 232.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(11.05, 93.5, 215.05);--bs-btn-hover-border-color: rgb(10.4, 88, 202.4);--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(10.4, 88, 202.4);--bs-btn-active-border-color: rgb(9.75, 82.5, 189.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(91.8, 99.45, 106.25);--bs-btn-hover-border-color: rgb(86.4, 93.6, 100);--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(86.4, 93.6, 100);--bs-btn-active-border-color: rgb(81, 87.75, 93.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(21.25, 114.75, 71.4);--bs-btn-hover-border-color: rgb(20, 108, 67.2);--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(20, 108, 67.2);--bs-btn-active-border-color: rgb(18.75, 101.25, 63);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(49.3, 209.95, 242.25);--bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(61.4, 212.6, 243);--bs-btn-active-border-color: rgb(37.2, 207.3, 241.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(255, 202.3, 44.2);--bs-btn-hover-border-color: rgb(255, 199.2, 31.8);--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(255, 205.4, 56.6);--bs-btn-active-border-color: rgb(255, 199.2, 31.8);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(187, 45.05, 58.65);--bs-btn-hover-border-color: rgb(176, 42.4, 55.2);--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(176, 42.4, 55.2);--bs-btn-active-border-color: rgb(165, 39.75, 51.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(210.8, 211.65, 212.5);--bs-btn-hover-border-color: rgb(198.4, 199.2, 200);--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(198.4, 199.2, 200);--bs-btn-active-border-color: rgb(186, 186.75, 187.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: rgb(66.3, 69.7, 73.1);--bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: rgb(77.4, 80.6, 83.8);--bs-btn-active-border-color: rgb(55.2, 58.8, 62.4);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: rgb(10.4, 88, 202.4);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: rgb(10.4, 88, 202.4);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: rgb(10.4, 88, 202.4);--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: rgb(221.7, 222.3, 222.9);--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef rgb(221.7, 222.3, 222.9);--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: rgb(221.7, 222.3, 222.9) rgb(221.7, 222.3, 222.9) #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: rgb(253.26, 253.63, 253.98);--bs-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--bs-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--bs-navbar-active-color: rgb(252.58, 253.55, 254.98);--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgb(253.26, 253.63, 253.98);--bs-navbar-brand-hover-color: rgb(252.58, 253.55, 254.98);--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: rgb(253.26, 253.63, 253.98);--bs-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--bs-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--bs-navbar-active-color: rgb(252.58, 253.55, 254.98);--bs-navbar-brand-color: rgb(253.26, 253.63, 253.98);--bs-navbar-brand-hover-color: rgb(252.58, 253.55, 254.98);--bs-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28253.26, 253.63, 253.98%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: rgb(221.7, 222.3, 222.9);--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%285.2, 44, 101.2%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: rgb(134, 182.5, 254);--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: rgb(5.2, 44, 101.2);--bs-accordion-active-bg: rgb(206.6, 226, 254.6)}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: rgb(221.7, 222.3, 222.9);--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: rgb(10.4, 88, 202.4);--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: rgb(221.7, 222.3, 222.9);--bs-pagination-focus-color: rgb(10.4, 88, 202.4);--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: rgb(221.7, 222.3, 222.9);display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: rgb(221.7, 222.3, 222.9);--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: rgb(221.7, 222.3, 222.9);--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: rgb(221.7, 222.3, 222.9);--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:hsla(0,0%,100%,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(48.6, 72.4, 248.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,72.4,248.6);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(52.2, 92.4, 229);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,92.4,229);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(93.4, 86.4, 204.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,86.4,204.6);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(95.8, 87.2, 179.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,87.2,179.4);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(109, 116.4, 159.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,116.4,159.8);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 143.2, 154.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,143.2,154.6);color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(17.8, 120, 185.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,120,185.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 146.4, 212.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,146.4,212.2);color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 146.8, 247.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(13,146.8,247.8);color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 53.6, 246.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(66.4,53.6,246.4);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(146.8, 30, 198);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(146.8,30,198);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(149.2, 30.8, 172.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(149.2,30.8,172.8);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(163.2, 86.8, 148);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(163.2,86.8,148);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.2, 63.6, 178.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(71.2,63.6,178.8);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 90.4, 241.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(66.4,90.4,241.2);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.8, 83.6, 217);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(71.8,83.6,217);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(152.2, 60, 168.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(152.2,60,168.6);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(154.6, 60.8, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(154.6,60.8,143.4);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(168.6, 116.8, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(168.6,116.8,118.6);color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(76.6, 93.6, 149.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(76.6,93.6,149.4);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(71.8, 120.4, 211.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(71.8,120.4,211.8);color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(133.6, 74.6, 180.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(133.6,74.6,180.4);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(169.2, 37, 176);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(169.2,37,176);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 57, 156.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(172.8,57,156.4);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(216.4, 51.8, 106.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(216.4,51.8,106.8);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(229.6, 81, 87.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(229.6,81,87.2);color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(230.4, 107.8, 82);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(230.4,107.8,82);color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(138.4, 84.6, 112.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(138.4,84.6,112.8);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(141.2, 111, 139.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(141.2,111,139.6);color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(133.6, 111.4, 175.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(133.6,111.4,175.2);color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(137.2, 75.8, 142.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(137.2,75.8,142.6);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 38.2, 138.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(172.8,38.2,138.2);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(176.4, 58.2, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(176.4,58.2,118.6);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(217.6, 52.2, 94.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(217.6,52.2,94.2);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(233.2, 82.2, 49.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(233.2,82.2,49.4);color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(234, 109, 44.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(234,109,44.2);color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(142, 85.8, 75);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(142,85.8,75);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(144.8, 112.2, 101.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(144.8,112.2,101.8);color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(137.2, 112.6, 137.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(137.2,112.6,137.4);color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 119.6, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(157,119.6,113.2);color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(237.4, 96, 64.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(237.4,96,64.8);color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(239.8, 96.8, 39.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(239.8,96.8,39.6);color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(253.8, 152.8, 14.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(253.8,152.8,14.8);color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(161.8, 129.6, 45.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(161.8,129.6,45.6);color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 156.4, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(157,156.4,108);color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 159.8, 105.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(158.2,159.8,105.4);color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(193.8, 122.2, 101);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(193.8,122.2,101);color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(197.4, 142.2, 81.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(197.4,142.2,81.4);color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(238.6, 136.2, 57);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(238.6,136.2,57);color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(241, 137, 31.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(241,137,31.8);color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(254.2, 166.2, 12.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(254.2,166.2,12.2);color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(163, 169.8, 37.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(163,169.8,37.8);color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(165.8, 196.2, 64.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(165.8,196.2,64.6);color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 196.6, 100.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(158.2,196.6,100.2);color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(20.2, 125, 151.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(20.2,125,151.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(55.8, 87.4, 147.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.8,87.4,147.2);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(59.4, 107.4, 127.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(59.4,107.4,127.6);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(100.6, 101.4, 103.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(100.6,101.4,103.2);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(103, 102.2, 78);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(103,102.2,78);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(116.2, 131.4, 58.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(116.2,131.4,58.4);color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(117, 158.2, 53.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(117,158.2,53.2);color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(27.8, 161.4, 110.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.8,161.4,110.8);color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.2, 161.8, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(20.2,161.8,146.4);color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 164.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(24.4,164.6,191.8);color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(104.8, 141, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(104.8,141,143.4);color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(107.2, 141.8, 118.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(107.2,141.8,118.2);color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(121.2, 197.8, 93.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(121.2,197.8,93.4);color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(29.2, 174.6, 124.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(29.2,174.6,124.2);color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 201.4, 186.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(24.4,201.4,186.6);color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 165.2, 245.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(13,165.2,245.2);color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(48.6, 127.6, 240.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,127.6,240.8);color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(52.2, 147.6, 221.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,147.6,221.2);color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(93.4, 141.6, 196.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,141.6,196.8);color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(95.8, 142.4, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,142.4,171.6);color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(109, 171.6, 152);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,171.6,152);color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 198.4, 146.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,198.4,146.8);color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(17.8, 175.2, 177.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,175.2,177.6);color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 201.6, 204.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,201.6,204.4);color:#000}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(48.6, 72.4, 248.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,72.4,248.6);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(52.2, 92.4, 229);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,92.4,229);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(93.4, 86.4, 204.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,86.4,204.6);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(95.8, 87.2, 179.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,87.2,179.4);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(109, 116.4, 159.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,116.4,159.8);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 143.2, 154.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,143.2,154.6);color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(17.8, 120, 185.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,120,185.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 146.4, 212.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,146.4,212.2);color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 146.8, 247.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(13,146.8,247.8);color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 53.6, 246.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(66.4,53.6,246.4);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(146.8, 30, 198);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(146.8,30,198);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(149.2, 30.8, 172.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(149.2,30.8,172.8);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(163.2, 86.8, 148);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(163.2,86.8,148);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.2, 63.6, 178.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(71.2,63.6,178.8);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(66.4, 90.4, 241.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(66.4,90.4,241.2);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(71.8, 83.6, 217);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(71.8,83.6,217);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(152.2, 60, 168.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(152.2,60,168.6);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(154.6, 60.8, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(154.6,60.8,143.4);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(168.6, 116.8, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(168.6,116.8,118.6);color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(76.6, 93.6, 149.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(76.6,93.6,149.4);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(71.8, 120.4, 211.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(71.8,120.4,211.8);color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(133.6, 74.6, 180.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(133.6,74.6,180.4);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(169.2, 37, 176);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(169.2,37,176);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 57, 156.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(172.8,57,156.4);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(216.4, 51.8, 106.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(216.4,51.8,106.8);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(229.6, 81, 87.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(229.6,81,87.2);color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(230.4, 107.8, 82);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(230.4,107.8,82);color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(138.4, 84.6, 112.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(138.4,84.6,112.8);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(141.2, 111, 139.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(141.2,111,139.6);color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(133.6, 111.4, 175.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(133.6,111.4,175.2);color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(137.2, 75.8, 142.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(137.2,75.8,142.6);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(172.8, 38.2, 138.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(172.8,38.2,138.2);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(176.4, 58.2, 118.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(176.4,58.2,118.6);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(217.6, 52.2, 94.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(217.6,52.2,94.2);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(233.2, 82.2, 49.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(233.2,82.2,49.4);color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(234, 109, 44.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(234,109,44.2);color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(142, 85.8, 75);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(142,85.8,75);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(144.8, 112.2, 101.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(144.8,112.2,101.8);color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(137.2, 112.6, 137.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(137.2,112.6,137.4);color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 119.6, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(157,119.6,113.2);color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(237.4, 96, 64.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(237.4,96,64.8);color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(239.8, 96.8, 39.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(239.8,96.8,39.6);color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(253.8, 152.8, 14.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(253.8,152.8,14.8);color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(161.8, 129.6, 45.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(161.8,129.6,45.6);color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(157, 156.4, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(157,156.4,108);color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 159.8, 105.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(158.2,159.8,105.4);color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(193.8, 122.2, 101);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(193.8,122.2,101);color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(197.4, 142.2, 81.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(197.4,142.2,81.4);color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(238.6, 136.2, 57);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(238.6,136.2,57);color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(241, 137, 31.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(241,137,31.8);color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(254.2, 166.2, 12.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(254.2,166.2,12.2);color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(163, 169.8, 37.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(163,169.8,37.8);color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(165.8, 196.2, 64.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(165.8,196.2,64.6);color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(158.2, 196.6, 100.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(158.2,196.6,100.2);color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(20.2, 125, 151.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(20.2,125,151.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(55.8, 87.4, 147.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.8,87.4,147.2);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(59.4, 107.4, 127.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(59.4,107.4,127.6);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(100.6, 101.4, 103.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(100.6,101.4,103.2);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: rgb(103, 102.2, 78);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(103,102.2,78);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(116.2, 131.4, 58.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(116.2,131.4,58.4);color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(117, 158.2, 53.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(117,158.2,53.2);color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(27.8, 161.4, 110.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.8,161.4,110.8);color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.2, 161.8, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(20.2,161.8,146.4);color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 164.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(24.4,164.6,191.8);color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(104.8, 141, 143.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(104.8,141,143.4);color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(107.2, 141.8, 118.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(107.2,141.8,118.2);color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(121.2, 197.8, 93.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(121.2,197.8,93.4);color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(29.2, 174.6, 124.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(29.2,174.6,124.2);color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: rgb(24.4, 201.4, 186.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) rgb(24.4,201.4,186.6);color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: rgb(13, 165.2, 245.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) rgb(13,165.2,245.2);color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: rgb(48.6, 127.6, 240.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(48.6,127.6,240.8);color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: rgb(52.2, 147.6, 221.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(52.2,147.6,221.2);color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: rgb(93.4, 141.6, 196.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) rgb(93.4,141.6,196.8);color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: rgb(95.8, 142.4, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) rgb(95.8,142.4,171.6);color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: rgb(109, 171.6, 152);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(109,171.6,152);color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: rgb(109.8, 198.4, 146.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) rgb(109.8,198.4,146.8);color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: rgb(17.8, 175.2, 177.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) rgb(17.8,175.2,177.6);color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: rgb(20.6, 201.6, 204.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(20.6,201.6,204.4);color:#000}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid rgb(221.7,222.3,222.9)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px rgb(221.7,222.3,222.9);border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:rgb(221.7,222.3,222.9);border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:rgb(221.7,222.3,222.9);border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:rgb(221.7,222.3,222.9);border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:rgb(221.7,222.3,222.9)}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}div.code-copy-outer-scaffold{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: rgb(221.7, 222.3, 222.9);--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button-tooltip{font-size:.75em}div.code-copy-outer-scaffold:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}div.code-copy-outer-scaffold:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}div.code-copy-outer-scaffold:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}div.code-copy-outer-scaffold:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>p:has(+section){margin-bottom:2rem}main.content>section:first-of-type>h2:nth-child(1),main.content>section:first-of-type>.h2:nth-child(1){margin-top:0}h2,.h2{border-bottom:1px solid rgb(221.7,222.3,222.9);padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:hsl(210,10.8108108108%,39.5098039216%)}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:hsl(210,10.8108108108%,39.5098039216%)}.quarto-layout-cell[data-ref-parent] caption{color:hsl(210,10.8108108108%,39.5098039216%)}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:hsl(210,10.8108108108%,39.5098039216%);font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:rgb(221.7,222.3,222.9) 1px solid;border-right:rgb(221.7,222.3,222.9) 1px solid;border-bottom:rgb(221.7,222.3,222.9) 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow-y:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:hsl(210,10.8108108108%,39.5098039216%)}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code.sourceCode,li code.sourceCode,td code.sourceCode{background-color:rgba(233,236,239,.65)}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:rgba(233,236,239,.65);padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:rgb(221.7,222.3,222.9)}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid rgb(221.7,222.3,222.9);border-top:1px solid rgb(221.7,222.3,222.9);border-bottom:1px solid rgb(221.7,222.3,222.9)}.callout.callout-style-default{border-left:5px solid;border-right:1px solid rgb(221.7,222.3,222.9);border-top:1px solid rgb(221.7,222.3,222.9);border-bottom:1px solid rgb(221.7,222.3,222.9)}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400;margin-bottom:-0.4em;margin-top:.5em}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-empty-content>.callout-header{margin-bottom:0em;border-bottom-right-radius:calc(0.375rem + -1px)}.callout>.callout-header.collapsed{border-bottom-right-radius:calc(0.375rem + -1px)}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em;border-top-right-radius:calc(0.375rem + -1px)}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:rgb(230.8,240.5,254.8)}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:rgb(232,243,237.9)}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:rgb(255,248.8,230.2)}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:rgb(254.8,242.1,231.5)}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:rgb(251.5,234.8,236.4)}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:rgb(253.26,253.63,253.98)}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:rgb(221.7,222.3,222.9);border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:hsl(0,0%,98%)}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:rgb(221.7,222.3,222.9);margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid rgb(221.7,222.3,222.9) 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid rgb(221.7,222.3,222.9)}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px rgb(221.7,222.3,222.9);margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px rgb(221.7,222.3,222.9);margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: rgb(253.53, 253.62, 253.7);--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: rgb(253.53, 253.62, 253.7);--bs-btn-hover-bg: rgb(130.05, 137.7, 144.5);--bs-btn-hover-border-color: rgb(122.7, 130.8, 138);--bs-btn-focus-shadow-rgb: 130, 137, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(137.4, 144.6, 151);--bs-btn-active-border-color: rgb(122.7, 130.8, 138);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:rgb(253.26,253.63,253.98)}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:rgb(253.26,253.63,253.98)}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:rgb(55.7432432432,62.5,69.2567567568);border:solid rgb(55.7432432432,62.5,69.2567567568) 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid rgb(210.6,211.4,212.2);border-bottom:1px solid rgb(210.6,211.4,212.2)}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}.screen-reader-only{position:absolute;clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:rgb(253.26,253.63,253.98);background:#517699}.quarto-title-banner a{color:rgb(253.26,253.63,253.98)}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:rgb(253.26,253.63,253.98)}.quarto-title-banner .code-tools-button{color:rgb(188.9556521739,202.9995652174,216.2843478261)}.quarto-title-banner .code-tools-button:hover{color:rgb(253.26,253.63,253.98)}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: rgb(253.53, 253.62, 253.7);--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: rgb(253.26, 253.63, 253.98);--quarto-scss-export-navbar-hl: rgb(252.58, 253.55, 254.98);--quarto-scss-export-navbar-brand: rgb(253.26, 253.63, 253.98);--quarto-scss-export-navbar-brand-hl: rgb(252.58, 253.55, 254.98);--quarto-scss-export-navbar-toggler-border-color: rgba(253.26, 253.63, 253.98, 0);--quarto-scss-export-navbar-hover-color: rgba(252.58, 253.55, 254.98, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253.26, 253.63, 253.98, 0.75);--quarto-scss-export-sidebar-fg: rgb(89.25, 89.25, 89.25);--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: rgb(117.3, 117.3, 117.3);--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: rgb(210.6, 211.4, 212.2);--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-table-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: rgb(206.6, 226, 254.6);--quarto-scss-export-blue-200: rgb(158.2, 197, 254.2);--quarto-scss-export-blue-300: rgb(109.8, 168, 253.8);--quarto-scss-export-blue-400: rgb(61.4, 139, 253.4);--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: rgb(10.4, 88, 202.4);--quarto-scss-export-blue-700: rgb(7.8, 66, 151.8);--quarto-scss-export-blue-800: rgb(5.2, 44, 101.2);--quarto-scss-export-blue-900: rgb(2.6, 22, 50.6);--quarto-scss-export-indigo-100: rgb(224.4, 207.2, 252.4);--quarto-scss-export-indigo-200: rgb(193.8, 159.4, 249.8);--quarto-scss-export-indigo-300: rgb(163.2, 111.6, 247.2);--quarto-scss-export-indigo-400: rgb(132.6, 63.8, 244.6);--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: rgb(81.6, 12.8, 193.6);--quarto-scss-export-indigo-700: rgb(61.2, 9.6, 145.2);--quarto-scss-export-indigo-800: rgb(40.8, 6.4, 96.8);--quarto-scss-export-indigo-900: rgb(20.4, 3.2, 48.4);--quarto-scss-export-purple-100: rgb(226.2, 217.2, 242.6);--quarto-scss-export-purple-200: rgb(197.4, 179.4, 230.2);--quarto-scss-export-purple-300: rgb(168.6, 141.6, 217.8);--quarto-scss-export-purple-400: rgb(139.8, 103.8, 205.4);--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: rgb(88.8, 52.8, 154.4);--quarto-scss-export-purple-700: rgb(66.6, 39.6, 115.8);--quarto-scss-export-purple-800: rgb(44.4, 26.4, 77.2);--quarto-scss-export-purple-900: rgb(22.2, 13.2, 38.6);--quarto-scss-export-pink-100: rgb(246.8, 214.2, 230.4);--quarto-scss-export-pink-200: rgb(238.6, 173.4, 205.8);--quarto-scss-export-pink-300: rgb(230.4, 132.6, 181.2);--quarto-scss-export-pink-400: rgb(222.2, 91.8, 156.6);--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: rgb(171.2, 40.8, 105.6);--quarto-scss-export-pink-700: rgb(128.4, 30.6, 79.2);--quarto-scss-export-pink-800: rgb(85.6, 20.4, 52.8);--quarto-scss-export-pink-900: rgb(42.8, 10.2, 26.4);--quarto-scss-export-red-100: rgb(248, 214.6, 217.8);--quarto-scss-export-red-200: rgb(241, 174.2, 180.6);--quarto-scss-export-red-300: rgb(234, 133.8, 143.4);--quarto-scss-export-red-400: rgb(227, 93.4, 106.2);--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: rgb(176, 42.4, 55.2);--quarto-scss-export-red-700: rgb(132, 31.8, 41.4);--quarto-scss-export-red-800: rgb(88, 21.2, 27.6);--quarto-scss-export-red-900: rgb(44, 10.6, 13.8);--quarto-scss-export-orange-100: rgb(254.6, 229.2, 208);--quarto-scss-export-orange-200: rgb(254.2, 203.4, 161);--quarto-scss-export-orange-300: rgb(253.8, 177.6, 114);--quarto-scss-export-orange-400: rgb(253.4, 151.8, 67);--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: rgb(202.4, 100.8, 16);--quarto-scss-export-orange-700: rgb(151.8, 75.6, 12);--quarto-scss-export-orange-800: rgb(101.2, 50.4, 8);--quarto-scss-export-orange-900: rgb(50.6, 25.2, 4);--quarto-scss-export-yellow-100: rgb(255, 242.6, 205.4);--quarto-scss-export-yellow-200: rgb(255, 230.2, 155.8);--quarto-scss-export-yellow-300: rgb(255, 217.8, 106.2);--quarto-scss-export-yellow-400: rgb(255, 205.4, 56.6);--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: rgb(204, 154.4, 5.6);--quarto-scss-export-yellow-700: rgb(153, 115.8, 4.2);--quarto-scss-export-yellow-800: rgb(102, 77.2, 2.8);--quarto-scss-export-yellow-900: rgb(51, 38.6, 1.4);--quarto-scss-export-green-100: rgb(209, 231, 220.8);--quarto-scss-export-green-200: rgb(163, 207, 186.6);--quarto-scss-export-green-300: rgb(117, 183, 152.4);--quarto-scss-export-green-400: rgb(71, 159, 118.2);--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: rgb(20, 108, 67.2);--quarto-scss-export-green-700: rgb(15, 81, 50.4);--quarto-scss-export-green-800: rgb(10, 54, 33.6);--quarto-scss-export-green-900: rgb(5, 27, 16.8);--quarto-scss-export-teal-100: rgb(210.4, 244.2, 234.2);--quarto-scss-export-teal-200: rgb(165.8, 233.4, 213.4);--quarto-scss-export-teal-300: rgb(121.2, 222.6, 192.6);--quarto-scss-export-teal-400: rgb(76.6, 211.8, 171.8);--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: rgb(25.6, 160.8, 120.8);--quarto-scss-export-teal-700: rgb(19.2, 120.6, 90.6);--quarto-scss-export-teal-800: rgb(12.8, 80.4, 60.4);--quarto-scss-export-teal-900: rgb(6.4, 40.2, 30.2);--quarto-scss-export-cyan-100: rgb(206.6, 244.4, 252);--quarto-scss-export-cyan-200: rgb(158.2, 233.8, 249);--quarto-scss-export-cyan-300: rgb(109.8, 223.2, 246);--quarto-scss-export-cyan-400: rgb(61.4, 212.6, 243);--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: rgb(10.4, 161.6, 192);--quarto-scss-export-cyan-700: rgb(7.8, 121.2, 144);--quarto-scss-export-cyan-800: rgb(5.2, 80.8, 96);--quarto-scss-export-cyan-900: rgb(2.6, 40.4, 48);--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: rgb(5.2, 44, 101.2);--quarto-scss-export-secondary-text-emphasis: rgb(43.2, 46.8, 50);--quarto-scss-export-success-text-emphasis: rgb(10, 54, 33.6);--quarto-scss-export-info-text-emphasis: rgb(5.2, 80.8, 96);--quarto-scss-export-warning-text-emphasis: rgb(102, 77.2, 2.8);--quarto-scss-export-danger-text-emphasis: rgb(88, 21.2, 27.6);--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: rgb(206.6, 226, 254.6);--quarto-scss-export-secondary-bg-subtle: rgb(225.6, 227.4, 229);--quarto-scss-export-success-bg-subtle: rgb(209, 231, 220.8);--quarto-scss-export-info-bg-subtle: rgb(206.6, 244.4, 252);--quarto-scss-export-warning-bg-subtle: rgb(255, 242.6, 205.4);--quarto-scss-export-danger-bg-subtle: rgb(248, 214.6, 217.8);--quarto-scss-export-light-bg-subtle: rgb(251.5, 252, 252.5);--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: rgb(158.2, 197, 254.2);--quarto-scss-export-secondary-border-subtle: rgb(196.2, 199.8, 203);--quarto-scss-export-success-border-subtle: rgb(163, 207, 186.6);--quarto-scss-export-info-border-subtle: rgb(158.2, 233.8, 249);--quarto-scss-export-warning-border-subtle: rgb(255, 230.2, 155.8);--quarto-scss-export-danger-border-subtle: rgb(241, 174.2, 180.6);--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: rgb(255, 242.6, 205.4);--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: rgb(134, 182.5, 254);--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: rgb(134, 182.5, 254);--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-form-select-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: rgb(182.4, 211.5, 254.4);--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef rgb(221.7, 222.3, 222.9);--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-pagination-focus-color: rgb(10.4, 88, 202.4);--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: rgb(10.4, 88, 202.4);--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: rgb(206.6, 226, 254.6);--quarto-scss-export-accordion-button-active-color: rgb(5.2, 44, 101.2);--quarto-scss-export-accordion-button-focus-border-color: rgb(134, 182.5, 254);--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: rgb(5.2, 44, 101.2);--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--quarto-scss-export-mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: rgb(221.7, 222.3, 222.9);--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.css b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..82b40f5 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2106 @@ +/*! + * Bootstrap Icons v1.13.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?e34853135f9e39acf64315236852cd5a") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } +.bi-bluesky::before { content: "\f7f9"; } +.bi-tux::before { content: "\f904"; } +.bi-beaker-fill::before { content: "\f905"; } +.bi-beaker::before { content: "\f906"; } +.bi-flask-fill::before { content: "\f907"; } +.bi-flask-florence-fill::before { content: "\f908"; } +.bi-flask-florence::before { content: "\f909"; } +.bi-flask::before { content: "\f90a"; } +.bi-leaf-fill::before { content: "\f90b"; } +.bi-leaf::before { content: "\f90c"; } +.bi-measuring-cup-fill::before { content: "\f90d"; } +.bi-measuring-cup::before { content: "\f90e"; } +.bi-unlock2-fill::before { content: "\f90f"; } +.bi-unlock2::before { content: "\f910"; } +.bi-battery-low::before { content: "\f911"; } +.bi-anthropic::before { content: "\f912"; } +.bi-apple-music::before { content: "\f913"; } +.bi-claude::before { content: "\f914"; } +.bi-openai::before { content: "\f915"; } +.bi-perplexity::before { content: "\f916"; } +.bi-css::before { content: "\f917"; } +.bi-javascript::before { content: "\f918"; } +.bi-typescript::before { content: "\f919"; } +.bi-fork-knife::before { content: "\f91a"; } +.bi-globe-americas-fill::before { content: "\f91b"; } +.bi-globe-asia-australia-fill::before { content: "\f91c"; } +.bi-globe-central-south-asia-fill::before { content: "\f91d"; } +.bi-globe-europe-africa-fill::before { content: "\f91e"; } diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.woff b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000..a4fa4f0 Binary files /dev/null and b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap-icons.woff differ diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap.min.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/clipboard/clipboard.min.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/axe/axe-check.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/axe/axe-check.js new file mode 100644 index 0000000..8808085 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/axe/axe-check.js @@ -0,0 +1,145 @@ +class QuartoAxeReporter { + constructor(axeResult, options) { + this.axeResult = axeResult; + this.options = options; + } + + report() { + throw new Error("report() is an abstract method"); + } +} + +class QuartoAxeJsonReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + report() { + console.log(JSON.stringify(this.axeResult, null, 2)); + } +} + +class QuartoAxeConsoleReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + report() { + for (const violation of this.axeResult.violations) { + console.log(violation.description); + for (const node of violation.nodes) { + for (const target of node.target) { + console.log(target); + console.log(document.querySelector(target)); + } + } + } + } +} + +class QuartoAxeDocumentReporter extends QuartoAxeReporter { + constructor(axeResult, options) { + super(axeResult, options); + } + + createViolationElement(violation) { + const violationElement = document.createElement("div"); + + const descriptionElement = document.createElement("div"); + descriptionElement.className = "quarto-axe-violation-description"; + descriptionElement.innerText = `${violation.impact.replace(/^[a-z]/, match => match.toLocaleUpperCase())}: ${violation.description}`; + violationElement.appendChild(descriptionElement); + + const helpElement = document.createElement("div"); + helpElement.className = "quarto-axe-violation-help"; + helpElement.innerText = violation.help; + violationElement.appendChild(helpElement); + + const nodesElement = document.createElement("div"); + nodesElement.className = "quarto-axe-violation-nodes"; + violationElement.appendChild(nodesElement); + const nodeElement = document.createElement("div"); + nodeElement.className = "quarto-axe-violation-selector"; + for (const node of violation.nodes) { + for (const target of node.target) { + const targetElement = document.createElement("span"); + targetElement.className = "quarto-axe-violation-target"; + targetElement.innerText = target; + nodeElement.appendChild(targetElement); + nodeElement.addEventListener("mouseenter", () => { + const element = document.querySelector(target); + if (element) { + element.scrollIntoView({ behavior: "smooth", block: "center" }); + element.classList.add("quarto-axe-hover-highlight"); + setTimeout(() => { + element.style.border = ""; + }, 2000); + } + }); + nodeElement.addEventListener("mouseleave", () => { + const element = document.querySelector(target); + if (element) { + element.classList.remove("quarto-axe-hover-highlight"); + } + }); + nodeElement.addEventListener("click", () => { + console.log(document.querySelector(target)); + }); + nodeElement.appendChild(targetElement); + } + nodesElement.appendChild(nodeElement); + } + return violationElement; + } + + report() { + const violations = this.axeResult.violations; + const reportElement = document.createElement("div"); + reportElement.className = "quarto-axe-report"; + if (violations.length === 0) { + const noViolationsElement = document.createElement("div"); + noViolationsElement.className = "quarto-axe-no-violations"; + noViolationsElement.innerText = "No axe-core violations found."; + reportElement.appendChild(noViolationsElement); + } + violations.forEach((violation) => { + reportElement.appendChild(this.createViolationElement(violation)); + }); + document.querySelector("main").appendChild(reportElement); + } +} + +const reporters = { + json: QuartoAxeJsonReporter, + console: QuartoAxeConsoleReporter, + document: QuartoAxeDocumentReporter, +}; + +class QuartoAxeChecker { + constructor(opts) { + this.options = opts; + } + async init() { + const axe = (await import("https://cdn.skypack.dev/pin/axe-core@v4.10.3-aVOFXWsJaCpVrtv89pCa/mode=imports,min/optimized/axe-core.js")).default; + const result = await axe.run({ + exclude: [ + // https://github.com/microsoft/tabster/issues/288 + // MS has claimed they won't fix this, so we need to add an exclusion to + // all tabster elements + "[data-tabster-dummy]" + ], + preload: { assets: ['cssom'], timeout: 50000 } + }); + const reporter = this.options === true ? new QuartoAxeConsoleReporter(result) : new reporters[this.options.output](result, this.options); + reporter.report(); + } +} + +export async function init() { + const opts = document.querySelector("#quarto-axe-checker-options"); + if (opts) { + const jsonOptions = JSON.parse(atob(opts.textContent)); + const checker = new QuartoAxeChecker(jsonOptions); + await checker.init(); + } +} \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/popper.min.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/popper.min.js new file mode 100644 index 0000000..e3726d7 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css new file mode 100644 index 0000000..7bb4f73 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/quarto-syntax-highlighting-ed96de9b727972fe78a7b5d16c58bf87.css @@ -0,0 +1,236 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +/* syntax highlight based on Pandoc's rules */ +pre > code.sourceCode > span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +/* Normal */ +code span { + color: #003B4F; +} + +/* Alert */ +code span.al { + color: #AD0000; + font-style: inherit; +} + +/* Annotation */ +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +/* Attribute */ +code span.at { + color: #657422; + font-style: inherit; +} + +/* BaseN */ +code span.bn { + color: #AD0000; + font-style: inherit; +} + +/* BuiltIn */ +code span.bu { + font-style: inherit; +} + +/* ControlFlow */ +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Char */ +code span.ch { + color: #20794D; + font-style: inherit; +} + +/* Constant */ +code span.cn { + color: #8f5902; + font-style: inherit; +} + +/* Comment */ +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +/* CommentVar */ +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +/* Documentation */ +code span.do { + color: #5E5E5E; + font-style: italic; +} + +/* DataType */ +code span.dt { + color: #AD0000; + font-style: inherit; +} + +/* DecVal */ +code span.dv { + color: #AD0000; + font-style: inherit; +} + +/* Error */ +code span.er { + color: #AD0000; + font-style: inherit; +} + +/* Extension */ +code span.ex { + font-style: inherit; +} + +/* Float */ +code span.fl { + color: #AD0000; + font-style: inherit; +} + +/* Function */ +code span.fu { + color: #4758AB; + font-style: inherit; +} + +/* Import */ +code span.im { + color: #00769E; + font-style: inherit; +} + +/* Information */ +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +/* Keyword */ +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Operator */ +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +/* Other */ +code span.ot { + color: #003B4F; + font-style: inherit; +} + +/* Preprocessor */ +code span.pp { + color: #AD0000; + font-style: inherit; +} + +/* SpecialChar */ +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +/* SpecialString */ +code span.ss { + color: #20794D; + font-style: inherit; +} + +/* String */ +code span.st { + color: #20794D; + font-style: inherit; +} + +/* Variable */ +code span.va { + color: #111111; + font-style: inherit; +} + +/* VerbatimString */ +code span.vs { + color: #20794D; + font-style: inherit; +} + +/* Warning */ +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // dispatch for htmlwidgets + // they use slideenter event to trigger resize + function fireSlideEnter() { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // dispatch for shiny + // they use BS shown and hidden events to trigger rendering + function distpatchShinyEvents(previous, current) { + if (window.jQuery) { + if (previous) { + window.jQuery(previous).trigger("hidden"); + } + if (current) { + window.jQuery(current).trigger("shown"); + } + } + } + + // tabby.js listener: Trigger event for htmlwidget and shiny + document.addEventListener( + "tabby", + function (event) { + fireSlideEnter(); + distpatchShinyEvents(event.detail.previousTab, event.detail.tab); + }, + false + ); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + // Categories search with listing only use path without query + const currentPagePath = offsetAbsoluteUrl( + window.location.origin + window.location.pathname + ); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + const encodedItem = encodeURI(item); + if ( + encodedItem === currentPagePath || + encodedItem === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (const child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +tabsets.init(); +axe.init(); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tabsets/tabsets.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tabsets/tabsets.js new file mode 100644 index 0000000..51345d0 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tabsets/tabsets.js @@ -0,0 +1,95 @@ +// grouped tabsets + +export function init() { + window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } + }); +} diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.css b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.umd.min.js b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/Week3Homework_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025-10_22_Contrad.fcs b/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025-10_22_Contrad.fcs new file mode 100644 index 0000000..5f0a4b4 Binary files /dev/null and b/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025-10_22_Contrad.fcs differ diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs b/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs new file mode 100644 index 0000000..f0fbb6f --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/data/AdditionalFCSFiles/2025_07_26_AB_02_NY068_02_Ctrl.fcs @@ -0,0 +1,55 @@ +FCS3.0 58 18356 18357 35556 0 0#$BEGINANALYSIS#0#$BEGINDATA#18357#$BEGINSTEXT#0#$BTIM#21:30:10.27#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#U1368#$DATATYPE#F#$DATE#26-Jul-2025#$ENDANALYSIS#0#$ENDDATA#35556#$ENDSTEXT#0#$ETIM#21:31:01.86#$FIL#Ctrl.fcs#$INST#Cytekbio#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#SSC-B-A#$P10R#4194304#$P10TYPE#Side_Scatter#$P10V#266#$P11B#32#$P11E#0,0#$P11N#BUV395-A#$P11R#4194304#$P11S#CD62L#$P11TYPE#Unmixed_Fluorescence#$P11V#0#$P12B#32#$P12E#0,0#$P12N#BUV563-A#$P12R#4194304#$P12S#CD69#$P12TYPE#Unmixed_Fluorescence#$P12V#0#$P13B#32#$P13E#0,0#$P13N#BUV615-A#$P13R#4194304#$P13S#CCR4#$P13TYPE#Unmixed_Fluorescence#$P13V#0#$P14B#32#$P14E#0,0#$P14N#BUV661-A#$P14R#4194304#$P14S#Vd2#$P14TYPE#Unmixed_Fluorescence#$P14V#0#$P15B#32#$P15E#0,0#$P15N#BUV737-A#$P15R#4194304#$P15S#CD38#$P15TYPE#Unmixed_Fluorescence#$P15V#0#$P16B#32#$P16E#0,0#$P16N#BUV805-A#$P16R#4194304#$P16S#CD4#$P16TYPE#Unmixed_Fluorescence#$P16V#0#$P17B#32#$P17E#0,0#$P17N#Pacific Blue-A#$P17R#4194304#$P17S#Dump#$P17TYPE#Unmixed_Fluorescence#$P17V#0#$P18B#32#$P18E#0,0#$P18N#BV480-A#$P18R#4194304#$P18S#CD161#$P18TYPE#Unmixed_Fluorescence#$P18V#0#$P19B#32#$P19E#0,0#$P19N#BV570-A#$P19R#4194304#$P19S#CD16#$P19TYPE#Unmixed_Fluorescence#$P19V#0#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#516839#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#BV605-A#$P20R#4194304#$P20S#CD45RA#$P20TYPE#Unmixed_Fluorescence#$P20V#0#$P21B#32#$P21E#0,0#$P21N#BV650-A#$P21R#4194304#$P21S#CD8#$P21TYPE#Unmixed_Fluorescence#$P21V#0#$P22B#32#$P22E#0,0#$P22N#BV711-A#$P22R#4194304#$P22S#Va7.2#$P22TYPE#Unmixed_Fluorescence#$P22V#0#$P23B#32#$P23E#0,0#$P23N#BV750-A#$P23R#4194304#$P23S#IFNg#$P23TYPE#Unmixed_Fluorescence#$P23V#0#$P24B#32#$P24E#0,0#$P24N#BV786-A#$P24R#4194304#$P24S#CCR6#$P24TYPE#Unmixed_Fluorescence#$P24V#0#$P25B#32#$P25E#0,0#$P25N#Alexa Fluor 488-A#$P25R#4194304#$P25S#FoxP3#$P25TYPE#Unmixed_Fluorescence#$P25V#0#$P26B#32#$P26E#0,0#$P26N#Spark Blue 550-A#$P26R#4194304#$P26S#CD3#$P26TYPE#Unmixed_Fluorescence#$P26V#0#$P27B#32#$P27E#0,0#$P27N#Spark Blue 574-A#$P27R#4194304#$P27S#CD45#$P27TYPE#Unmixed_Fluorescence#$P27V#0#$P28B#32#$P28E#0,0#$P28N#RB613-A#$P28R#4194304#$P28S#PD1#$P28TYPE#Unmixed_Fluorescence#$P28V#0#$P29B#32#$P29E#0,0#$P29N#RB705-A#$P29R#4194304#$P29S#CD26#$P29TYPE#Unmixed_Fluorescence#$P29V#0#$P2B#32#$P2E#0,0#$P2N#SSC-W#$P2R#4194304#$P2TYPE#Side_Scatter#$P2V#350#$P30B#32#$P30E#0,0#$P30N#RB780-A#$P30R#4194304#$P30S#CXCR5#$P30TYPE#Unmixed_Fluorescence#$P30V#0#$P31B#32#$P31E#0,0#$P31N#PE-A#$P31R#4194304#$P31S#ICOS#$P31TYPE#Unmixed_Fluorescence#$P31V#0#$P32B#32#$P32E#0,0#$P32N#PE-Dazzle594-A#$P32R#4194304#$P32S#TNFa#$P32TYPE#Unmixed_Fluorescence#$P32V#0#$P33B#32#$P33E#0,0#$P33N#PE-Cy5-A#$P33R#4194304#$P33S#CXCR3#$P33TYPE#Unmixed_Fluorescence#$P33V#0#$P34B#32#$P34E#0,0#$P34N#PE-Fire 700-A#$P34R#4194304#$P34S#CD127#$P34TYPE#Unmixed_Fluorescence#$P34V#0#$P35B#32#$P35E#0,0#$P35N#PE-Fire 744-A#$P35R#4194304#$P35S#CD25#$P35TYPE#Unmixed_Fluorescence#$P35V#0#$P36B#32#$P36E#0,0#$P36N#PE-Vio770-A#$P36R#4194304#$P36S#HLA-DR#$P36TYPE#Unmixed_Fluorescence#$P36V#0#$P37B#32#$P37E#0,0#$P37N#APC-A#$P37R#4194304#$P37S#CD39#$P37TYPE#Unmixed_Fluorescence#$P37V#0#$P38B#32#$P38E#0,0#$P38N#Alexa Fluor 647-A#$P38R#4194304#$P38S#IL-2#$P38TYPE#Unmixed_Fluorescence#$P38V#0#$P39B#32#$P39E#0,0#$P39N#APC-R700-A#$P39R#4194304#$P39S#CD107a#$P39TYPE#Unmixed_Fluorescence#$P39V#0#$P3B#32#$P3E#0,0#$P3N#SSC-H#$P3R#4194304#$P3TYPE#Side_Scatter#$P3V#350#$P40B#32#$P40E#0,0#$P40N#Zombie NIR-A#$P40R#4194304#$P40S#Viability#$P40TYPE#Unmixed_Fluorescence#$P40V#0#$P41B#32#$P41E#0,0#$P41N#APC-Fire 750-A#$P41R#4194304#$P41S#CD27#$P41TYPE#Unmixed_Fluorescence#$P41V#0#$P42B#32#$P42E#0,0#$P42N#APC-Fire 810-A#$P42R#4194304#$P42S#CCR7#$P42TYPE#Unmixed_Fluorescence#$P42V#0#$P43B#32#$P43E#0,0#$P43N#AF-A#$P43R#4194304#$P43TYPE#Unmixed_Fluorescence#$P43V#0#$P4B#32#$P4E#0,0#$P4N#SSC-A#$P4R#4194304#$P4TYPE#Side_Scatter#$P4V#350#$P5B#32#$P5E#0,0#$P5N#FSC-W#$P5R#4194304#$P5TYPE#Forward_Scatter#$P5V#64#$P6B#32#$P6E#0,0#$P6N#FSC-H#$P6R#4194304#$P6TYPE#Forward_Scatter#$P6V#64#$P7B#32#$P7E#0,0#$P7N#FSC-A#$P7R#4194304#$P7TYPE#Forward_Scatter#$P7V#64#$P8B#32#$P8E#0,0#$P8N#SSC-B-W#$P8R#4194304#$P8TYPE#Side_Scatter#$P8V#266#$P9B#32#$P9E#0,0#$P9N#SSC-B-H#$P9R#4194304#$P9TYPE#Side_Scatter#$P9V#266#$PAR#43#$PROJ#2025_07_26_AB_02#$SPILLOVER#33,BUV395-A,BUV563-A,BUV615-A,BUV661-A,BUV737-A,BUV805-A,Pacific Blue-A,BV480-A,BV570-A,BV605-A,BV650-A,BV711-A,BV750-A,BV786-A,Alexa Fluor 488-A,Spark Blue 550-A,Spark Blue 574-A,RB613-A,RB705-A,RB780-A,PE-A,PE-Dazzle594-A,PE-Cy5-A,PE-Fire 700-A,PE-Fire 744-A,PE-Vio770-A,APC-A,Alexa Fluor 647-A,APC-R700-A,Zombie NIR-A,APC-Fire 750-A,APC-Fire 810-A,AF-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#60.66#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Desktop/Check/2025_07_26_AB_02_NY068_02_Ctrl.fcs#flowCore_$P10Rmax#4194303#flowCore_$P10Rmin#0#flowCore_$P11Rmax#4192505.75#flowCore_$P11Rmin#-111.00008392334#flowCore_$P12Rmax#4192505.75#flowCore_$P12Rmin#-111.00008392334#flowCore_$P13Rmax#4192505.75#flowCore_$P13Rmin#-111.00008392334#flowCore_$P14Rmax#4192505.75#flowCore_$P14Rmin#-111.00008392334#flowCore_$P15Rmax#4192505.75#flowCore_$P15Rmin#-111.00008392334#flowCore_$P16Rmax#4192505.75#flowCore_$P16Rmin#-111.00008392334#flowCore_$P17Rmax#4192505.75#flowCore_$P17Rmin#-111.00008392334#flowCore_$P18Rmax#4192505.75#flowCore_$P18Rmin#-111.00008392334#flowCore_$P19Rmax#4192505.75#flowCore_$P19Rmin#-111.00008392334#flowCore_$P1Rmax#506.501251220703#flowCore_$P1Rmin#0#flowCore_$P20Rmax#4192505.75#flowCore_$P20Rmin#-111.00008392334#flowCore_$P21Rmax#4192505.75#flowCore_$P21Rmin#-111.00008392334#flowCore_$P22Rmax#4192505.75#flowCore_$P22Rmin#-111.00008392334#flowCore_$P23Rmax#4192505.75#flowCore_$P23Rmin#-111.00008392334#flowCore_$P24Rmax#4192505.75#flowCore_$P24Rmin#-111.00008392334#flowCore_$P25Rmax#4192505.75#flowCore_$P25Rmin#-111.00008392334#flowCore_$P26Rmax#4192505.75#flowCore_$P26Rmin#-111.00008392334#flowCore_$P27Rmax#4192505.75#flowCore_$P27Rmin#-111.00008392334#flowCore_$P28Rmax#4192505.75#flowCore_$P28Rmin#-111.00008392334#flowCore_$P29Rmax#4192505.75#flowCore_$P29Rmin#-111.00008392334#flowCore_$P2Rmax#4194303#flowCore_$P2Rmin#0#flowCore_$P30Rmax#4192505.75#flowCore_$P30Rmin#-111.00008392334#flowCore_$P31Rmax#4192505.75#flowCore_$P31Rmin#-111.00008392334#flowCore_$P32Rmax#4192505.75#flowCore_$P32Rmin#-111.00008392334#flowCore_$P33Rmax#4192505.75#flowCore_$P33Rmin#-111.00008392334#flowCore_$P34Rmax#4192505.75#flowCore_$P34Rmin#-111.00008392334#flowCore_$P35Rmax#4192505.75#flowCore_$P35Rmin#-111.00008392334#flowCore_$P36Rmax#4192505.75#flowCore_$P36Rmin#-111.00008392334#flowCore_$P37Rmax#4192505.75#flowCore_$P37Rmin#-111.00008392334#flowCore_$P38Rmax#4192505.75#flowCore_$P38Rmin#-111.00008392334#flowCore_$P39Rmax#4192505.75#flowCore_$P39Rmin#-111.00008392334#flowCore_$P3Rmax#4194303#flowCore_$P3Rmin#0#flowCore_$P40Rmax#4192505.75#flowCore_$P40Rmin#-111.00008392334#flowCore_$P41Rmax#4192505.75#flowCore_$P41Rmin#-111.00008392334#flowCore_$P42Rmax#4192505.75#flowCore_$P42Rmin#-111.00008392334#flowCore_$P43Rmax#4194303#flowCore_$P43Rmin#-111#flowCore_$P4Rmax#4194303#flowCore_$P4Rmin#0#flowCore_$P5Rmax#4194303#flowCore_$P5Rmin#0#flowCore_$P6Rmax#4194303#flowCore_$P6Rmin#0#flowCore_$P7Rmax#4194303#flowCore_$P7Rmin#0#flowCore_$P8Rmax#4194303#flowCore_$P8Rmin#0#flowCore_$P9Rmax#4194303#flowCore_$P9Rmin#0#FSC ASF#1.18#GROUPNAME#NY068_02#GUID#2025_07_26_AB_02_NY068_02_Ctrl.fcs#LASER1ASF#1.12#LASER1DELAY#-39.65#LASER1NAME#YellowGreen#LASER2ASF#1.09#LASER2DELAY#-19.825#LASER2NAME#Violet#LASER3ASF#1.15#LASER3DELAY#0#LASER3NAME#Blue#LASER4ASF#1.04#LASER4DELAY#20.3#LASER4NAME#Red#LASER5ASF#1.09#LASER5DELAY#39.8#LASER5NAME#UV#ORIGINALGUID#2025_07_26_AB_02_NY068_02_Ctrl#P10DISPLAY#LIN#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LOG#P19DISPLAY#LOG#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LIN#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LOG#P37DISPLAY#LOG#P38DISPLAY#LOG#P39DISPLAY#LOG#P3DISPLAY#LIN#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P4DISPLAY#LIN#P5DISPLAY#LIN#P6DISPLAY#LIN#P7DISPLAY#LIN#P8DISPLAY#LIN#P9DISPLAY#LIN#THRESHOLD#(FSC,600000)#transformation#custom#TUBENAME#Ctrl#USERSETTINGNAME#DR_2025_AB_Nuclear#WINDOW EXTENSION#3#CIEH߳II.ƔI Iޙ}I>FHHaDE_B Byq BʙC%6DöFFG+ceDM4CLjFFlÄBxCpJDz^D^Cӄz7CD#)DÏYD sD7%\"YBȔ;ECIABHHI1EI@II@H^G@H+EWCE)D) C|XUB"CݥCYAE;uCg(I$HBIT@I-I%aGIPI߆I$t-HHCTS-Dz*;yC9* BÐGZïD@EFqFJОzMBCZ+FI@F +D xC! 3BNC:D=7ÿW9CGDφĹrEDǂC6CE|CcI?:I3IkotI3dIpIDI; H=`I +DpE%rbĕB"DDT9HC FY*H+DgDCDFFC>CC9\DDƐF +E}D1ٓE!O^E ++eC&D MA>BEþ!CI=,hH@I#.I;ZIIII5VH HܕDDEPC6CY`vC\F:Cc kCNE@&Fp!E'CFzF qEsSG*xü~DP[C(EBlFabDǺE$CσDPD@!BPEECjC*IY!I@II=I8isIMJ};IYтHi`II4FEl,DfvbGXIX}GY +CݕEGBDD7kDzLÊFFqERDGneBDD72D%E!#F>mf-6dCa=D D(EtDEŐC.I=tH!IZuI3eIII7JH~HݧF[E<8D|;CDЭD=G QCD!?C|6h)yE";DqFJF` DE EDE9CwEEJKC( 2DmO/D%MEPFDEWC-4I9I;IAyI5TIPIOI3H`H&5F*DmgCGoCoF$yäZD9C7kD+ĄIvF pW`FF/ďDvHm>EluxD\E(WE5E[~D;5wD~T~DSEOEEC"II}I0oI*I"hI'I2ldHކIDEBQ]C[BCD MSLC 5C!F4$GvNjcD֖BץDkiF(FoCC- DҍCEIDWEa8D8C2ÈC/DV5EC` ÒEBHHEOD|E:#*Õ+FڻC`DD >DڟCI]C1D 0GDMAwFRFF/ FJQWBm%DzCMCGDHE켖CzVD6ԸDwDH,' ECg+EPCI/CH銠I I1III&(HHEaD ذC,whCNdDJFRG!DfDU‹0FE挥R=EF y*rDJ$EnDwD iCCDCD!CTDD/yFoFhECΦPI9&HI ܒI(I}`J +WI3HHW6CE 38C*zDQ JBGF&G+F8CCnCUF{F@E!B-: DzcD6+Cw&EBPDB;4ôZPDD6pDSWûD3lE[VC8IBHÆIXI9[I*pIOIAH_րHD0CE\·A"2r¬T/CD5FJGa#]a_DåD*DFZFĮò:FdDMĕ; DXFHE@YCC (DGF=Bխ+F?f JEODqFHEC C1oUB5DRD`!FLv4EoE2CbI3HHqI*}IcI-I2#>H3HG dD@2D +ȗCԢFfCN|BIG۽DNBFE!ClFFC F`D0FODkJ0ñEsKDCAD DbFF E@CV)I?OIPILpI)e[IGI*I;]I @I2(F{E9%D2/}CCC'2˾DGF ÖSDۈoDUG*:F}ĞaFDKDiD`DjED]BEE;DHGEqZ%D?DY>EH$KE%+ElC4̚IF3I ISBI3xII妍IDI I.mCoHE.C|mC + +FD}E=p D ;Ft}D}/ÌHD!DCFȜFDyFF ³GD Ë́FEv@DŽED6BnfDC҅@Dxm2o D,EVC+QVI9HHńOI+III*HHE\E:EÕF!DE*H.E1D&#C<ĚDFVF?DCAI EE)B٬3C&A*C$jCIYI-~6HH̛FDNeW[S +CðPD DCG-L(G?ūDDk7DvÔ)\4sF>UDEUCC1FadFCn D\%Qb%5·CFjEDCy +)ºDZCDC#EnpEx6E CI8 Hα I9iI1`UIII8 HHFETPĔ[C`vGCdkĤc4GE hDĵwãGu"F=CnF=n?DY@[=rÛyE0`Ct PXCKD) CֱFF"EӧXC3I@H͋@I$I2cIPII@%HۀH݋F[D>FBF#IEaD26CnC[D!#ǍCE$CI9HHTI*AII7I5rHo0H#€EČ PD "B4dGNDFr&@+FnnDc"աBvF27sFXB29GvE!wDraCoEcEV×s¦#D}FEEIyCI)I I!I/@yIǾII" HFH>(9F C,vzG Coe%ΙDD<>8}EA]?!FF'CGH"nD`yCCBDYvEDtD=nDtEV»DTģHE+E1CI=I I:I8UILII>҇HjI +[FEF)C=(ÒnGh @jzCwDr(E.C}FF|%D6Ft5C9=E*; +K F,(DFD,P>oDRÄDME}LFDEWCI6I€I:zI1fyI8II/FH@H;E<B̋hmBqCvDEw2Ħ͆C%cGHOhE nPD*I@GcLFmb CEƒSDdĂ9EX,EpȰD|C~ JUDDFF@&EC7MIIʫI5Iz^I4J;J`IG6H@I'|PCxeDu+FCC9މG.D0E[C(DRCAzIDeѯEfDcFϘFPJDMG +°oD`ɋD3WFkF8D}#saDDJzDyDD*)E'`E\AITAHӖII4 I IԳcIU'fHH} ED+|CpBMXCv4O7ĆEwGKZb4EĻD!yTFFD$FƯ":CDkrEj?E- +E +xCXC9CDD/EbEʍ Er-CsIC^sHI ]yI0BII@I;GHv H)BcE@DD +/ZFDv!EI3C/AEQC)DyTD4DF+F=W(DG BOIpC EJE~E;b}LDG\D) Y:DE EC\D&K*bDFXFFWD>FC9KD0DG`FhKFSCcvDpD:YDܠBF/(EME)C"IA-HgHExI(^II6I9cHHCPK F]e8C CwDD +˂C7G+G7yʙD [CN C:FiE., F5CWDzDVEdE[twpCA`CDDI IѷIk'HiH GzE1T&C;DϘ~FD'PÑGoTD+'D:CNDe;웭G ?Fu-đoIG.DDtE7($ECCE7D6e D;D-NFF8ECIC.yE%BKFFV&E-GkD>JE=WC55@I FI. Ix~IIAHC@HBEF[7Ä|+ı3&C>~XnC4DGhGED[IDS˸D_FOF2D$FEDD%{CcEGD_ g0COTܟD=F8מFE|BUqI;{bI-jI]I0I+HJI7թHw`ICE4*CCC8D CfFVGZFDڬÜ9D)vFF0$DeBgB5sDáfEXCb~DDwC9TD^oIHaFD-5E`CI5&II5gI8III09HeHZC2 E9}C|DkG(;Cǀ~)DDCCcPD+GK+EDK+\HIXD&EWB3ECxġ6Z[DSFxH?Oh0DøD@FF*rĜ~ :CiDkFwD:ƗÏ.M8bbDG&DnD-0H%EA{C:kI6II=I&!IXILI3H1HÃX\E7C CnFTŞDC?0D'OG\*DsD ÷1wDoGCFOF8`p&'Cv _EɹE|&D]C>DKD>NCg EqBCyp}IIo'I0I3I)I?IXNIEH I{/$E1$a +A݁CCJT+D?ClHFG4Œ}DjDyD{JFsIFt BCJ6}PDC%BEDEV[qD^MDJ>#DkCA/]&EA.I?ZIIBkI,IHIq@I?aHHCXD5'E,ý&0ZWBwD/ADVD @GdBYcDk";TDA FtF8/F]5CzÆmDLDEEvBDUCã=rDSD9BvChmKEBDoTEfBIW%I,wI~/mI0C%IJKISSHiI4MD8PDYJusĺcDPS +ĊDDCFܳ(H.FuCɗpDD9G &FÜC¡F:^%De CſFwB"E<ÊVEC >?XzDERD@EC@I>4HII0zIpIуI5HՠHFG,DIJICܯaoѣC^ܼDGgGD5 E'đrCFF[ĕ FڂZDUN?gDQEEzCMw6 (pDd7C\HHyD&FF^R0D?C/ADG$BvCDCyWF2jD!F3zF?ð5QH*w2Ģt(]6DbPFnFR8D4uDhCemVgD\CF[\YEbEXCX_IAH`II1IπI/IEnHPH=E(~ERKÐy5iF\W"DFLCGV'CϭCB`D'3€FFDFUbmC_C>5DCE-DCB@R@FӚDXzF:DCn9F4FVDWfÕvCTC+ /uE;KD? DB? \xDৢDy)CD~eEzCKI53)I^I=I+6III1n8IIMDNzE*zC/BKBOÅ@CoBXĄ3pHjEC\r$D@ D{F@F/6nqp#eEQDTDED̟ D"ćDCiD`V.D)TE}C~UI;2H `I & +I'\I?IϱI908HڡI +3FVE%Ó'4DwCDBË_JDw2C8 FE'G F!DxH%D]FFHE qv DZD,Y,E,D BdECDχ/DNsDC>hCDiEnE1ChI46HI pI/IQIoI-HHɖE!F1ĊeDWC~iDlmD'G GqzD*kÛxC fFF +s:NUFr]IlI2I/PIڇJuI.HI C%Dč2CECIBZI#?IX4I;IrII8HI FQwD?i#E%E ÀC-ABMG xG#D dKDw~DiĢ~CF.F m oF xCDJEEQڛc#Da D<&$D ċ'7ėFLZC¬5D"òND7F1Fj* fFn&RDR^C}C6gC Q[D} KsA<.DCLCFYsFxECI5tHHI5wIIȸI/gHq@HeE Dx,òbCOdxD.t,BDPGOٵG3 SD$eCFWF-d>F4KZC)RNrDF*XEÜ2D<B7|DCFa"F&Ee2NC!I>&I vI6I+5TI{I'I7w5H'IEKAf~E,CtR˜qҙG NÓOEqh  äSCXD>,cDkFԌFrFO8oG_X{D-EARCs%DїE/E UCD :PßD`CHEEEC%ID(HXI'I/II+sI@sH`Hp5 +E9l G]оxDmYFBB2D,D@1D)E3B7,JGFYWsHD rTDEbEرCAXD,~ +LD#D&!D2WSE,EU/EB#mIA5 HQHAI*8wII>I3FHH&CӤEN =Jdo͉D!}ękC4G,GCKDCFFCbdNFFCBje.EE&A^Cf6-×HE=(|DDF1e:F:+Ey BsI4 HǀI -.I75IIȾI3fH`HZFD ICjqGAՉDDkLECcD)I4EFNUFpFbECEDz9N<+DSEDӈI, AEǴEDD ]D7FciE[ERB&C$gIIoI I2|I8IÕSI.H@HßF{îs}p[Jyk`FD1FC05F>FgCuzFeC|!F9F+pgE/G>Dx`ÄDuR™EKDŒDTp‰`gD RD D;PDĖE[X@1IGHFI>rI@*IhI3I@ +H)H\FwE D?B脶C_H+CiDyC[FfFѱCuCJ^JD<NyE CBFJ*Emf/EC:ICbH^Ij8I)*II I; H@HqCy6E€.ďvCM%Doq!CsEG%FDBĨB tF$;FOR At CX]C+D cD(1@WCD +DyC#DUywzEʛC7XI?I9H@II5I`INI7HHDEijlDCwއDgÆCGGxtjDc,DCL5FFAE*XÇ<\"DlFHD{CNCkFFQ{tEBӊI1_HF@I I5IIՅI-XH H0rC +O7ċ]aC"5C(\CQE=GxFD3lCtB-FF+O6CRC!D+2ÌڀDΡC~jCLȑD+|ӖCCDĩz:EB>;I?IXI.uI-<2I(IA%I5H HBpEd:\Ĕd2]~,CbDDFF+~uElC)^ICE  |D D" ZBN9)F7GF D_.DRFAF4 }âG!DiPFETD͂gCDǡlCVDu4u-EisB IKGILe0IқI/WDIFhJ ѢIC|I/IjhF6E]ªm%C#Ç;DY.D Cs6EFGLFDvDWD*;DG&£FiCDfLxD"uCEC×xGCS(DbD + DgCJèEReCI<:HI'WI/YIII>H H@F5EhFo︧CFDqCDEB,D +C~"C)%vIFF@]XVF(DDIZD{Al"FXuE [MCqnD)BdD*nEEEB9$IA<I,0Id,3I/1eIXIyI?I - I7YEC&E7!O;B;AQ߇¬@CË D_GXF}ABD)QDFǯeFEm D<;E&C@CE LDl!ilCCxD@EC_I7I;IkxI2I.hJI/݈IPI"G 'E-F$A¸ΤÉGCF>MDkaD6D"CCE1D%8FwTFFiӳFXR_DGE+C̗D5ETFC\DCRCDN_FBT_E00000000 \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorDownloads.csv b/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorDownloads.csv new file mode 100644 index 0000000..14f3689 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorDownloads.csv @@ -0,0 +1,885 @@ +"Year","Month","Nb_of_distinct_IPs","Nb_of_downloads","package" +2025,"Jan",2233,4445,"flowCore" +2025,"Feb",2376,4254,"flowCore" +2025,"Mar",2691,5218,"flowCore" +2025,"Apr",2660,5098,"flowCore" +2025,"May",2643,5838,"flowCore" +2025,"Jun",2523,5070,"flowCore" +2025,"Jul",2887,5789,"flowCore" +2025,"Aug",2592,15192,"flowCore" +2025,"Sep",3039,38024,"flowCore" +2025,"Oct",2958,15956,"flowCore" +2025,"Nov",3645,10389,"flowCore" +2025,"Dec",3982,14260,"flowCore" +2025,"all",26720,129533,"flowCore" +2025,"Jan",2501,4902,"cytolib" +2025,"Feb",2588,4534,"cytolib" +2025,"Mar",2755,5463,"cytolib" +2025,"Apr",2741,4785,"cytolib" +2025,"May",2545,4725,"cytolib" +2025,"Jun",2325,3897,"cytolib" +2025,"Jul",2731,4705,"cytolib" +2025,"Aug",2358,14116,"cytolib" +2025,"Sep",2868,37708,"cytolib" +2025,"Oct",2867,15757,"cytolib" +2025,"Nov",3500,9793,"cytolib" +2025,"Dec",3167,12209,"cytolib" +2025,"all",25638,122594,"cytolib" +2025,"Jan",1006,2206,"flowWorkspace" +2025,"Feb",980,1802,"flowWorkspace" +2025,"Mar",1386,2734,"flowWorkspace" +2025,"Apr",1330,2614,"flowWorkspace" +2025,"May",1381,3229,"flowWorkspace" +2025,"Jun",1200,2420,"flowWorkspace" +2025,"Jul",1469,2894,"flowWorkspace" +2025,"Aug",1242,6409,"flowWorkspace" +2025,"Sep",1515,22768,"flowWorkspace" +2025,"Oct",1506,8677,"flowWorkspace" +2025,"Nov",1936,5480,"flowWorkspace" +2025,"Dec",2406,9893,"flowWorkspace" +2025,"all",13542,71126,"flowWorkspace" +2025,"Jan",1066,2080,"ncdfFlow" +2025,"Feb",1038,1758,"ncdfFlow" +2025,"Mar",1246,2295,"ncdfFlow" +2025,"Apr",1235,2103,"ncdfFlow" +2025,"May",1251,2417,"ncdfFlow" +2025,"Jun",1040,1635,"ncdfFlow" +2025,"Jul",1227,1962,"ncdfFlow" +2025,"Aug",1157,5939,"ncdfFlow" +2025,"Sep",1410,22562,"ncdfFlow" +2025,"Oct",1438,8643,"ncdfFlow" +2025,"Nov",1846,4987,"ncdfFlow" +2025,"Dec",2465,8821,"ncdfFlow" +2025,"all",12958,65202,"ncdfFlow" +2025,"Jan",869,1692,"flowViz" +2025,"Feb",851,1372,"flowViz" +2025,"Mar",1014,1763,"flowViz" +2025,"Apr",1000,1762,"flowViz" +2025,"May",1042,1879,"flowViz" +2025,"Jun",862,1338,"flowViz" +2025,"Jul",1023,1520,"flowViz" +2025,"Aug",1028,7336,"flowViz" +2025,"Sep",1192,23253,"flowViz" +2025,"Oct",1222,8503,"flowViz" +2025,"Nov",1529,4913,"flowViz" +2025,"Dec",2477,10579,"flowViz" +2025,"all",11266,65910,"flowViz" +2025,"Jan",1014,1814,"FlowSOM" +2025,"Feb",943,1553,"FlowSOM" +2025,"Mar",1029,1769,"FlowSOM" +2025,"Apr",1163,2102,"FlowSOM" +2025,"May",1074,2057,"FlowSOM" +2025,"Jun",995,1658,"FlowSOM" +2025,"Jul",1211,2098,"FlowSOM" +2025,"Aug",1056,4924,"FlowSOM" +2025,"Sep",1360,14884,"FlowSOM" +2025,"Oct",1281,5173,"FlowSOM" +2025,"Nov",1523,4312,"FlowSOM" +2025,"Dec",1841,7558,"FlowSOM" +2025,"all",11129,49902,"FlowSOM" +2025,"Jan",724,1521,"ggcyto" +2025,"Feb",712,1225,"ggcyto" +2025,"Mar",930,1603,"ggcyto" +2025,"Apr",1028,1838,"ggcyto" +2025,"May",1103,2232,"ggcyto" +2025,"Jun",849,1537,"ggcyto" +2025,"Jul",1026,1839,"ggcyto" +2025,"Aug",885,5193,"ggcyto" +2025,"Sep",1133,16596,"ggcyto" +2025,"Oct",1249,6653,"ggcyto" +2025,"Nov",1393,4083,"ggcyto" +2025,"Dec",1850,8319,"ggcyto" +2025,"all",10062,52639,"ggcyto" +2025,"Jan",592,1291,"openCyto" +2025,"Feb",582,1029,"openCyto" +2025,"Mar",711,1281,"openCyto" +2025,"Apr",720,1365,"openCyto" +2025,"May",745,1589,"openCyto" +2025,"Jun",675,1266,"openCyto" +2025,"Jul",798,1544,"openCyto" +2025,"Aug",759,4851,"openCyto" +2025,"Sep",989,19126,"openCyto" +2025,"Oct",953,5720,"openCyto" +2025,"Nov",1196,3753,"openCyto" +2025,"Dec",1916,8847,"openCyto" +2025,"all",8214,51662,"openCyto" +2025,"Jan",579,971,"quantiseqr" +2025,"Feb",633,957,"quantiseqr" +2025,"Mar",684,1052,"quantiseqr" +2025,"Apr",757,1131,"quantiseqr" +2025,"May",811,1260,"quantiseqr" +2025,"Jun",773,1188,"quantiseqr" +2025,"Jul",855,1349,"quantiseqr" +2025,"Aug",762,1025,"quantiseqr" +2025,"Sep",1111,1655,"quantiseqr" +2025,"Oct",917,1239,"quantiseqr" +2025,"Nov",1088,1474,"quantiseqr" +2025,"Dec",1057,1394,"quantiseqr" +2025,"all",8760,14695,"quantiseqr" +2025,"Jan",478,1039,"flowStats" +2025,"Feb",450,800,"flowStats" +2025,"Mar",450,884,"flowStats" +2025,"Apr",599,1173,"flowStats" +2025,"May",619,1325,"flowStats" +2025,"Jun",527,1014,"flowStats" +2025,"Jul",686,1230,"flowStats" +2025,"Aug",643,4856,"flowStats" +2025,"Sep",782,19103,"flowStats" +2025,"Oct",764,6182,"flowStats" +2025,"Nov",1134,3335,"flowStats" +2025,"Dec",1835,7470,"flowStats" +2025,"all",6792,48411,"flowStats" +2025,"Jan",458,1124,"CytoML" +2025,"Feb",424,859,"CytoML" +2025,"Mar",547,1169,"CytoML" +2025,"Apr",586,1135,"CytoML" +2025,"May",536,1150,"CytoML" +2025,"Jun",480,940,"CytoML" +2025,"Jul",627,1229,"CytoML" +2025,"Aug",575,4261,"CytoML" +2025,"Sep",720,14501,"CytoML" +2025,"Oct",738,4396,"CytoML" +2025,"Nov",852,2933,"CytoML" +2025,"Dec",1234,6871,"CytoML" +2025,"all",5688,40568,"CytoML" +2025,"Jan",467,1075,"CATALYST" +2025,"Feb",419,983,"CATALYST" +2025,"Mar",472,1075,"CATALYST" +2025,"Apr",530,1213,"CATALYST" +2025,"May",555,1284,"CATALYST" +2025,"Jun",534,1058,"CATALYST" +2025,"Jul",689,1307,"CATALYST" +2025,"Aug",552,2044,"CATALYST" +2025,"Sep",714,8339,"CATALYST" +2025,"Oct",730,1904,"CATALYST" +2025,"Nov",815,2163,"CATALYST" +2025,"Dec",1161,3626,"CATALYST" +2025,"all",5787,26071,"CATALYST" +2025,"Jan",579,1093,"flowAI" +2025,"Feb",560,888,"flowAI" +2025,"Mar",607,1013,"flowAI" +2025,"Apr",641,1135,"flowAI" +2025,"May",620,1100,"flowAI" +2025,"Jun",563,908,"flowAI" +2025,"Jul",652,965,"flowAI" +2025,"Aug",541,832,"flowAI" +2025,"Sep",724,2413,"flowAI" +2025,"Oct",680,1424,"flowAI" +2025,"Nov",598,810,"flowAI" +2025,"Dec",851,1126,"flowAI" +2025,"all",6349,13707,"flowAI" +2025,"Jan",355,849,"diffcyt" +2025,"Feb",395,816,"diffcyt" +2025,"Mar",447,915,"diffcyt" +2025,"Apr",436,946,"diffcyt" +2025,"May",429,945,"diffcyt" +2025,"Jun",325,672,"diffcyt" +2025,"Jul",479,898,"diffcyt" +2025,"Aug",495,1235,"diffcyt" +2025,"Sep",602,4833,"diffcyt" +2025,"Oct",591,1507,"diffcyt" +2025,"Nov",601,1028,"diffcyt" +2025,"Dec",879,2275,"diffcyt" +2025,"all",4759,16919,"diffcyt" +2025,"Jan",302,614,"flowDensity" +2025,"Feb",332,531,"flowDensity" +2025,"Mar",331,531,"flowDensity" +2025,"Apr",401,689,"flowDensity" +2025,"May",432,761,"flowDensity" +2025,"Jun",403,593,"flowDensity" +2025,"Jul",435,606,"flowDensity" +2025,"Aug",395,770,"flowDensity" +2025,"Sep",558,2784,"flowDensity" +2025,"Oct",497,1248,"flowDensity" +2025,"Nov",386,565,"flowDensity" +2025,"Dec",913,3798,"flowDensity" +2025,"all",4151,13490,"flowDensity" +2025,"Jan",211,574,"flowMeans" +2025,"Feb",225,497,"flowMeans" +2025,"Mar",180,424,"flowMeans" +2025,"Apr",241,596,"flowMeans" +2025,"May",347,795,"flowMeans" +2025,"Jun",261,525,"flowMeans" +2025,"Jul",329,572,"flowMeans" +2025,"Aug",297,565,"flowMeans" +2025,"Sep",335,680,"flowMeans" +2025,"Oct",248,531,"flowMeans" +2025,"Nov",449,906,"flowMeans" +2025,"Dec",1327,2091,"flowMeans" +2025,"all",3483,8756,"flowMeans" +2025,"Jan",281,525,"PeacoQC" +2025,"Feb",303,457,"PeacoQC" +2025,"Mar",334,561,"PeacoQC" +2025,"Apr",366,640,"PeacoQC" +2025,"May",314,562,"PeacoQC" +2025,"Jun",283,434,"PeacoQC" +2025,"Jul",369,510,"PeacoQC" +2025,"Aug",278,419,"PeacoQC" +2025,"Sep",558,896,"PeacoQC" +2025,"Oct",416,659,"PeacoQC" +2025,"Nov",351,548,"PeacoQC" +2025,"Dec",712,993,"PeacoQC" +2025,"all",3858,7204,"PeacoQC" +2025,"Jan",240,464,"flowFP" +2025,"Feb",235,410,"flowFP" +2025,"Mar",185,358,"flowFP" +2025,"Apr",278,624,"flowFP" +2025,"May",298,637,"flowFP" +2025,"Jun",322,532,"flowFP" +2025,"Jul",321,473,"flowFP" +2025,"Aug",315,622,"flowFP" +2025,"Sep",348,664,"flowFP" +2025,"Oct",276,510,"flowFP" +2025,"Nov",314,453,"flowFP" +2025,"Dec",1256,1872,"flowFP" +2025,"all",3458,7619,"flowFP" +2025,"Jan",262,505,"flowClean" +2025,"Feb",297,482,"flowClean" +2025,"Mar",301,448,"flowClean" +2025,"Apr",333,609,"flowClean" +2025,"May",312,588,"flowClean" +2025,"Jun",316,496,"flowClean" +2025,"Jul",374,527,"flowClean" +2025,"Aug",324,527,"flowClean" +2025,"Sep",377,566,"flowClean" +2025,"Oct",339,548,"flowClean" +2025,"Nov",254,354,"flowClean" +2025,"Dec",636,790,"flowClean" +2025,"all",3472,6440,"flowClean" +2025,"Jan",259,485,"flowPeaks" +2025,"Feb",256,416,"flowPeaks" +2025,"Mar",234,484,"flowPeaks" +2025,"Apr",300,572,"flowPeaks" +2025,"May",341,692,"flowPeaks" +2025,"Jun",318,491,"flowPeaks" +2025,"Jul",397,577,"flowPeaks" +2025,"Aug",309,551,"flowPeaks" +2025,"Sep",373,659,"flowPeaks" +2025,"Oct",230,361,"flowPeaks" +2025,"Nov",265,406,"flowPeaks" +2025,"Dec",377,488,"flowPeaks" +2025,"all",2959,6182,"flowPeaks" +2025,"Jan",202,401,"COMPASS" +2025,"Feb",187,305,"COMPASS" +2025,"Mar",189,365,"COMPASS" +2025,"Apr",221,409,"COMPASS" +2025,"May",266,535,"COMPASS" +2025,"Jun",279,436,"COMPASS" +2025,"Jul",383,542,"COMPASS" +2025,"Aug",235,429,"COMPASS" +2025,"Sep",288,490,"COMPASS" +2025,"Oct",277,463,"COMPASS" +2025,"Nov",229,331,"COMPASS" +2025,"Dec",709,886,"COMPASS" +2025,"all",2988,5592,"COMPASS" +2025,"Jan",241,468,"SamSPECTRAL" +2025,"Feb",251,403,"SamSPECTRAL" +2025,"Mar",225,421,"SamSPECTRAL" +2025,"Apr",225,418,"SamSPECTRAL" +2025,"May",215,451,"SamSPECTRAL" +2025,"Jun",254,369,"SamSPECTRAL" +2025,"Jul",306,447,"SamSPECTRAL" +2025,"Aug",239,443,"SamSPECTRAL" +2025,"Sep",288,461,"SamSPECTRAL" +2025,"Oct",162,284,"SamSPECTRAL" +2025,"Nov",469,994,"SamSPECTRAL" +2025,"Dec",602,1312,"SamSPECTRAL" +2025,"all",2848,6471,"SamSPECTRAL" +2025,"Jan",176,428,"flowVS" +2025,"Feb",206,378,"flowVS" +2025,"Mar",205,361,"flowVS" +2025,"Apr",230,446,"flowVS" +2025,"May",265,543,"flowVS" +2025,"Jun",282,418,"flowVS" +2025,"Jul",313,435,"flowVS" +2025,"Aug",276,476,"flowVS" +2025,"Sep",260,421,"flowVS" +2025,"Oct",232,394,"flowVS" +2025,"Nov",192,304,"flowVS" +2025,"Dec",701,817,"flowVS" +2025,"all",2837,5421,"flowVS" +2025,"Jan",164,368,"cydar" +2025,"Feb",197,291,"cydar" +2025,"Mar",173,331,"cydar" +2025,"Apr",215,418,"cydar" +2025,"May",222,488,"cydar" +2025,"Jun",251,369,"cydar" +2025,"Jul",362,509,"cydar" +2025,"Aug",222,377,"cydar" +2025,"Sep",329,683,"cydar" +2025,"Oct",301,811,"cydar" +2025,"Nov",221,319,"cydar" +2025,"Dec",575,677,"cydar" +2025,"all",2764,5641,"cydar" +2025,"Jan",217,495,"flowMerge" +2025,"Feb",222,396,"flowMerge" +2025,"Mar",188,365,"flowMerge" +2025,"Apr",207,445,"flowMerge" +2025,"May",184,428,"flowMerge" +2025,"Jun",206,330,"flowMerge" +2025,"Jul",269,386,"flowMerge" +2025,"Aug",282,518,"flowMerge" +2025,"Sep",179,301,"flowMerge" +2025,"Oct",175,317,"flowMerge" +2025,"Nov",234,349,"flowMerge" +2025,"Dec",861,1060,"flowMerge" +2025,"all",2816,5390,"flowMerge" +2025,"Jan",223,499,"flowTrans" +2025,"Feb",223,392,"flowTrans" +2025,"Mar",178,338,"flowTrans" +2025,"Apr",204,432,"flowTrans" +2025,"May",166,386,"flowTrans" +2025,"Jun",164,268,"flowTrans" +2025,"Jul",239,357,"flowTrans" +2025,"Aug",300,582,"flowTrans" +2025,"Sep",357,1012,"flowTrans" +2025,"Oct",160,285,"flowTrans" +2025,"Nov",183,301,"flowTrans" +2025,"Dec",734,849,"flowTrans" +2025,"all",2844,5701,"flowTrans" +2025,"Jan",211,380,"distinct" +2025,"Feb",184,285,"distinct" +2025,"Mar",211,400,"distinct" +2025,"Apr",224,475,"distinct" +2025,"May",281,563,"distinct" +2025,"Jun",317,505,"distinct" +2025,"Jul",427,711,"distinct" +2025,"Aug",235,409,"distinct" +2025,"Sep",330,632,"distinct" +2025,"Oct",238,447,"distinct" +2025,"Nov",181,292,"distinct" +2025,"Dec",331,466,"distinct" +2025,"all",2746,5565,"distinct" +2025,"Jan",201,381,"flowCut" +2025,"Feb",198,320,"flowCut" +2025,"Mar",196,376,"flowCut" +2025,"Apr",227,431,"flowCut" +2025,"May",218,450,"flowCut" +2025,"Jun",240,368,"flowCut" +2025,"Jul",274,407,"flowCut" +2025,"Aug",187,299,"flowCut" +2025,"Sep",310,531,"flowCut" +2025,"Oct",250,404,"flowCut" +2025,"Nov",204,300,"flowCut" +2025,"Dec",357,425,"flowCut" +2025,"all",2485,4692,"flowCut" +2025,"Jan",202,456,"flowMatch" +2025,"Feb",183,323,"flowMatch" +2025,"Mar",158,297,"flowMatch" +2025,"Apr",215,462,"flowMatch" +2025,"May",240,516,"flowMatch" +2025,"Jun",211,377,"flowMatch" +2025,"Jul",302,457,"flowMatch" +2025,"Aug",197,352,"flowMatch" +2025,"Sep",160,275,"flowMatch" +2025,"Oct",134,251,"flowMatch" +2025,"Nov",166,269,"flowMatch" +2025,"Dec",640,725,"flowMatch" +2025,"all",2418,4760,"flowMatch" +2025,"Jan",181,379,"flowBeads" +2025,"Feb",178,327,"flowBeads" +2025,"Mar",161,317,"flowBeads" +2025,"Apr",193,408,"flowBeads" +2025,"May",200,438,"flowBeads" +2025,"Jun",192,298,"flowBeads" +2025,"Jul",259,374,"flowBeads" +2025,"Aug",196,340,"flowBeads" +2025,"Sep",190,311,"flowBeads" +2025,"Oct",151,300,"flowBeads" +2025,"Nov",175,278,"flowBeads" +2025,"Dec",770,891,"flowBeads" +2025,"all",2532,4661,"flowBeads" +2025,"Jan",168,371,"flowTime" +2025,"Feb",171,330,"flowTime" +2025,"Mar",159,354,"flowTime" +2025,"Apr",230,507,"flowTime" +2025,"May",237,503,"flowTime" +2025,"Jun",241,356,"flowTime" +2025,"Jul",328,472,"flowTime" +2025,"Aug",225,385,"flowTime" +2025,"Sep",180,309,"flowTime" +2025,"Oct",149,287,"flowTime" +2025,"Nov",178,294,"flowTime" +2025,"Dec",525,638,"flowTime" +2025,"all",2443,4806,"flowTime" +2025,"Jan",186,383,"sccomp" +2025,"Feb",197,335,"sccomp" +2025,"Mar",200,359,"sccomp" +2025,"Apr",222,435,"sccomp" +2025,"May",244,505,"sccomp" +2025,"Jun",219,384,"sccomp" +2025,"Jul",289,484,"sccomp" +2025,"Aug",216,373,"sccomp" +2025,"Sep",205,353,"sccomp" +2025,"Oct",188,338,"sccomp" +2025,"Nov",194,322,"sccomp" +2025,"Dec",284,398,"sccomp" +2025,"all",2293,4669,"sccomp" +2025,"Jan",175,403,"flowCHIC" +2025,"Feb",193,340,"flowCHIC" +2025,"Mar",166,326,"flowCHIC" +2025,"Apr",196,447,"flowCHIC" +2025,"May",237,504,"flowCHIC" +2025,"Jun",206,319,"flowCHIC" +2025,"Jul",258,373,"flowCHIC" +2025,"Aug",246,420,"flowCHIC" +2025,"Sep",175,278,"flowCHIC" +2025,"Oct",134,234,"flowCHIC" +2025,"Nov",163,283,"flowCHIC" +2025,"Dec",433,506,"flowCHIC" +2025,"all",2203,4433,"flowCHIC" +2025,"Jan",160,328,"flowSpecs" +2025,"Feb",145,243,"flowSpecs" +2025,"Mar",154,260,"flowSpecs" +2025,"Apr",204,399,"flowSpecs" +2025,"May",232,455,"flowSpecs" +2025,"Jun",202,323,"flowSpecs" +2025,"Jul",275,420,"flowSpecs" +2025,"Aug",195,311,"flowSpecs" +2025,"Sep",204,334,"flowSpecs" +2025,"Oct",137,254,"flowSpecs" +2025,"Nov",167,260,"flowSpecs" +2025,"Dec",431,531,"flowSpecs" +2025,"all",2208,4118,"flowSpecs" +2025,"Jan",162,480,"DepecheR" +2025,"Feb",158,379,"DepecheR" +2025,"Mar",171,370,"DepecheR" +2025,"Apr",231,594,"DepecheR" +2025,"May",263,598,"DepecheR" +2025,"Jun",237,479,"DepecheR" +2025,"Jul",304,534,"DepecheR" +2025,"Aug",196,313,"DepecheR" +2025,"Sep",187,296,"DepecheR" +2025,"Oct",155,270,"DepecheR" +2025,"Nov",154,269,"DepecheR" +2025,"Dec",330,402,"DepecheR" +2025,"all",2216,4984,"DepecheR" +2025,"Jan",144,319,"treekoR" +2025,"Feb",135,221,"treekoR" +2025,"Mar",174,294,"treekoR" +2025,"Apr",188,369,"treekoR" +2025,"May",251,477,"treekoR" +2025,"Jun",221,342,"treekoR" +2025,"Jul",326,480,"treekoR" +2025,"Aug",203,313,"treekoR" +2025,"Sep",177,301,"treekoR" +2025,"Oct",157,291,"treekoR" +2025,"Nov",187,343,"treekoR" +2025,"Dec",280,416,"treekoR" +2025,"all",2169,4166,"treekoR" +2025,"Jan",191,434,"flowBin" +2025,"Feb",188,332,"flowBin" +2025,"Mar",149,291,"flowBin" +2025,"Apr",140,315,"flowBin" +2025,"May",124,356,"flowBin" +2025,"Jun",132,231,"flowBin" +2025,"Jul",227,353,"flowBin" +2025,"Aug",200,344,"flowBin" +2025,"Sep",174,297,"flowBin" +2025,"Oct",188,338,"flowBin" +2025,"Nov",194,294,"flowBin" +2025,"Dec",490,566,"flowBin" +2025,"all",2226,4151,"flowBin" +2025,"Jan",167,380,"MetaCyto" +2025,"Feb",166,313,"MetaCyto" +2025,"Mar",167,316,"MetaCyto" +2025,"Apr",189,401,"MetaCyto" +2025,"May",212,427,"MetaCyto" +2025,"Jun",180,302,"MetaCyto" +2025,"Jul",273,393,"MetaCyto" +2025,"Aug",183,294,"MetaCyto" +2025,"Sep",280,479,"MetaCyto" +2025,"Oct",141,285,"MetaCyto" +2025,"Nov",146,279,"MetaCyto" +2025,"Dec",309,403,"MetaCyto" +2025,"all",2122,4272,"MetaCyto" +2025,"Jan",197,393,"immunoClust" +2025,"Feb",172,306,"immunoClust" +2025,"Mar",163,299,"immunoClust" +2025,"Apr",200,473,"immunoClust" +2025,"May",227,515,"immunoClust" +2025,"Jun",204,347,"immunoClust" +2025,"Jul",283,411,"immunoClust" +2025,"Aug",180,303,"immunoClust" +2025,"Sep",146,282,"immunoClust" +2025,"Oct",133,328,"immunoClust" +2025,"Nov",158,269,"immunoClust" +2025,"Dec",343,415,"immunoClust" +2025,"all",2042,4341,"immunoClust" +2025,"Jan",156,345,"scDataviz" +2025,"Feb",177,293,"scDataviz" +2025,"Mar",150,299,"scDataviz" +2025,"Apr",194,373,"scDataviz" +2025,"May",216,446,"scDataviz" +2025,"Jun",228,345,"scDataviz" +2025,"Jul",313,445,"scDataviz" +2025,"Aug",174,297,"scDataviz" +2025,"Sep",153,255,"scDataviz" +2025,"Oct",139,248,"scDataviz" +2025,"Nov",169,262,"scDataviz" +2025,"Dec",275,351,"scDataviz" +2025,"all",2061,3959,"scDataviz" +2025,"Jan",182,314,"cytoMEM" +2025,"Feb",158,272,"cytoMEM" +2025,"Mar",189,291,"cytoMEM" +2025,"Apr",229,435,"cytoMEM" +2025,"May",208,417,"cytoMEM" +2025,"Jun",208,324,"cytoMEM" +2025,"Jul",229,328,"cytoMEM" +2025,"Aug",170,278,"cytoMEM" +2025,"Sep",187,310,"cytoMEM" +2025,"Oct",193,380,"cytoMEM" +2025,"Nov",146,313,"cytoMEM" +2025,"Dec",175,268,"cytoMEM" +2025,"all",2036,3930,"cytoMEM" +2025,"Jan",182,313,"flowPloidy" +2025,"Feb",164,294,"flowPloidy" +2025,"Mar",146,245,"flowPloidy" +2025,"Apr",196,391,"flowPloidy" +2025,"May",215,450,"flowPloidy" +2025,"Jun",193,315,"flowPloidy" +2025,"Jul",246,364,"flowPloidy" +2025,"Aug",240,404,"flowPloidy" +2025,"Sep",166,261,"flowPloidy" +2025,"Oct",136,247,"flowPloidy" +2025,"Nov",140,234,"flowPloidy" +2025,"Dec",311,383,"flowPloidy" +2025,"all",2008,3901,"flowPloidy" +2025,"Jan",171,322,"plotGrouper" +2025,"Feb",142,257,"plotGrouper" +2025,"Mar",143,266,"plotGrouper" +2025,"Apr",136,272,"plotGrouper" +2025,"May",159,358,"plotGrouper" +2025,"Jun",131,236,"plotGrouper" +2025,"Jul",201,317,"plotGrouper" +2025,"Aug",173,289,"plotGrouper" +2025,"Sep",149,271,"plotGrouper" +2025,"Oct",127,255,"plotGrouper" +2025,"Nov",139,215,"plotGrouper" +2025,"Dec",426,502,"plotGrouper" +2025,"all",1976,3560,"plotGrouper" +2025,"Jan",206,563,"CytoDx" +2025,"Feb",180,363,"CytoDx" +2025,"Mar",169,311,"CytoDx" +2025,"Apr",159,379,"CytoDx" +2025,"May",149,385,"CytoDx" +2025,"Jun",128,231,"CytoDx" +2025,"Jul",223,343,"CytoDx" +2025,"Aug",205,330,"CytoDx" +2025,"Sep",196,321,"CytoDx" +2025,"Oct",164,315,"CytoDx" +2025,"Nov",167,288,"CytoDx" +2025,"Dec",217,316,"CytoDx" +2025,"all",1970,4145,"CytoDx" +2025,"Jan",175,391,"Sconify" +2025,"Feb",139,276,"Sconify" +2025,"Mar",162,310,"Sconify" +2025,"Apr",212,465,"Sconify" +2025,"May",215,457,"Sconify" +2025,"Jun",209,329,"Sconify" +2025,"Jul",262,371,"Sconify" +2025,"Aug",168,288,"Sconify" +2025,"Sep",173,292,"Sconify" +2025,"Oct",134,360,"Sconify" +2025,"Nov",131,252,"Sconify" +2025,"Dec",192,287,"Sconify" +2025,"all",1861,4078,"Sconify" +2025,"Jan",199,316,"flowPlots" +2025,"Feb",201,360,"flowPlots" +2025,"Mar",121,248,"flowPlots" +2025,"Apr",152,315,"flowPlots" +2025,"May",148,366,"flowPlots" +2025,"Jun",143,247,"flowPlots" +2025,"Jul",227,340,"flowPlots" +2025,"Aug",205,385,"flowPlots" +2025,"Sep",157,268,"flowPlots" +2025,"Oct",127,216,"flowPlots" +2025,"Nov",169,265,"flowPlots" +2025,"Dec",234,301,"flowPlots" +2025,"all",1935,3627,"flowPlots" +2025,"Jan",160,400,"GateFinder" +2025,"Feb",145,306,"GateFinder" +2025,"Mar",153,333,"GateFinder" +2025,"Apr",158,358,"GateFinder" +2025,"May",144,378,"GateFinder" +2025,"Jun",134,229,"GateFinder" +2025,"Jul",213,335,"GateFinder" +2025,"Aug",179,291,"GateFinder" +2025,"Sep",154,267,"GateFinder" +2025,"Oct",119,268,"GateFinder" +2025,"Nov",151,265,"GateFinder" +2025,"Dec",393,495,"GateFinder" +2025,"all",1945,3925,"GateFinder" +2025,"Jan",147,235,"flowGate" +2025,"Feb",134,214,"flowGate" +2025,"Mar",156,250,"flowGate" +2025,"Apr",197,356,"flowGate" +2025,"May",230,459,"flowGate" +2025,"Jun",165,271,"flowGate" +2025,"Jul",196,310,"flowGate" +2025,"Aug",163,262,"flowGate" +2025,"Sep",183,308,"flowGate" +2025,"Oct",142,257,"flowGate" +2025,"Nov",137,225,"flowGate" +2025,"Dec",190,261,"flowGate" +2025,"all",1851,3408,"flowGate" +2025,"Jan",153,313,"flowGraph" +2025,"Feb",115,222,"flowGraph" +2025,"Mar",144,260,"flowGraph" +2025,"Apr",193,391,"flowGraph" +2025,"May",238,488,"flowGraph" +2025,"Jun",171,307,"flowGraph" +2025,"Jul",245,372,"flowGraph" +2025,"Aug",154,254,"flowGraph" +2025,"Sep",161,284,"flowGraph" +2025,"Oct",136,234,"flowGraph" +2025,"Nov",137,234,"flowGraph" +2025,"Dec",202,286,"flowGraph" +2025,"all",1807,3645,"flowGraph" +2025,"Jan",188,388,"infinityFlow" +2025,"Feb",143,252,"infinityFlow" +2025,"Mar",148,261,"infinityFlow" +2025,"Apr",174,356,"infinityFlow" +2025,"May",202,441,"infinityFlow" +2025,"Jun",174,295,"infinityFlow" +2025,"Jul",212,315,"infinityFlow" +2025,"Aug",155,257,"infinityFlow" +2025,"Sep",166,271,"infinityFlow" +2025,"Oct",121,246,"infinityFlow" +2025,"Nov",129,221,"infinityFlow" +2025,"Dec",255,320,"infinityFlow" +2025,"all",1841,3623,"infinityFlow" +2025,"Jan",136,276,"cyanoFilter" +2025,"Feb",131,230,"cyanoFilter" +2025,"Mar",137,245,"cyanoFilter" +2025,"Apr",165,344,"cyanoFilter" +2025,"May",208,419,"cyanoFilter" +2025,"Jun",188,306,"cyanoFilter" +2025,"Jul",239,355,"cyanoFilter" +2025,"Aug",181,292,"cyanoFilter" +2025,"Sep",148,257,"cyanoFilter" +2025,"Oct",144,256,"cyanoFilter" +2025,"Nov",139,223,"cyanoFilter" +2025,"Dec",209,276,"cyanoFilter" +2025,"all",1745,3479,"cyanoFilter" +2025,"Jan",171,310,"optimalFlow" +2025,"Feb",132,230,"optimalFlow" +2025,"Mar",154,271,"optimalFlow" +2025,"Apr",174,347,"optimalFlow" +2025,"May",208,427,"optimalFlow" +2025,"Jun",162,284,"optimalFlow" +2025,"Jul",220,340,"optimalFlow" +2025,"Aug",167,260,"optimalFlow" +2025,"Sep",165,264,"optimalFlow" +2025,"Oct",131,247,"optimalFlow" +2025,"Nov",129,218,"optimalFlow" +2025,"Dec",244,305,"optimalFlow" +2025,"all",1858,3503,"optimalFlow" +2025,"Jan",161,298,"CytoGLMM" +2025,"Feb",140,252,"CytoGLMM" +2025,"Mar",153,264,"CytoGLMM" +2025,"Apr",134,289,"CytoGLMM" +2025,"May",152,359,"CytoGLMM" +2025,"Jun",159,255,"CytoGLMM" +2025,"Jul",246,353,"CytoGLMM" +2025,"Aug",166,336,"CytoGLMM" +2025,"Sep",156,266,"CytoGLMM" +2025,"Oct",169,275,"CytoGLMM" +2025,"Nov",130,221,"CytoGLMM" +2025,"Dec",261,336,"CytoGLMM" +2025,"all",1891,3504,"CytoGLMM" +2025,"Jan",146,284,"scifer" +2025,"Feb",134,215,"scifer" +2025,"Mar",129,261,"scifer" +2025,"Apr",154,353,"scifer" +2025,"May",173,394,"scifer" +2025,"Jun",191,306,"scifer" +2025,"Jul",216,338,"scifer" +2025,"Aug",156,275,"scifer" +2025,"Sep",149,260,"scifer" +2025,"Oct",120,240,"scifer" +2025,"Nov",122,199,"scifer" +2025,"Dec",332,414,"scifer" +2025,"all",1828,3539,"scifer" +2025,"Jan",167,323,"cytoKernel" +2025,"Feb",136,228,"cytoKernel" +2025,"Mar",146,253,"cytoKernel" +2025,"Apr",144,305,"cytoKernel" +2025,"May",185,389,"cytoKernel" +2025,"Jun",173,294,"cytoKernel" +2025,"Jul",241,365,"cytoKernel" +2025,"Aug",152,263,"cytoKernel" +2025,"Sep",154,255,"cytoKernel" +2025,"Oct",120,221,"cytoKernel" +2025,"Nov",159,239,"cytoKernel" +2025,"Dec",239,305,"cytoKernel" +2025,"all",1864,3440,"cytoKernel" +2025,"Jan",138,252,"CytoPipeline" +2025,"Feb",134,230,"CytoPipeline" +2025,"Mar",147,273,"CytoPipeline" +2025,"Apr",175,342,"CytoPipeline" +2025,"May",214,439,"CytoPipeline" +2025,"Jun",161,273,"CytoPipeline" +2025,"Jul",190,269,"CytoPipeline" +2025,"Aug",152,260,"CytoPipeline" +2025,"Sep",180,280,"CytoPipeline" +2025,"Oct",145,253,"CytoPipeline" +2025,"Nov",163,253,"CytoPipeline" +2025,"Dec",219,305,"CytoPipeline" +2025,"all",1846,3429,"CytoPipeline" +2025,"Jan",163,304,"censcyt" +2025,"Feb",136,226,"censcyt" +2025,"Mar",132,230,"censcyt" +2025,"Apr",121,298,"censcyt" +2025,"May",158,368,"censcyt" +2025,"Jun",116,222,"censcyt" +2025,"Jul",193,319,"censcyt" +2025,"Aug",165,273,"censcyt" +2025,"Sep",146,252,"censcyt" +2025,"Oct",117,222,"censcyt" +2025,"Nov",178,314,"censcyt" +2025,"Dec",263,382,"censcyt" +2025,"all",1771,3410,"censcyt" +2025,"Jan",177,304,"flowCyBar" +2025,"Feb",162,315,"flowCyBar" +2025,"Mar",122,245,"flowCyBar" +2025,"Apr",128,314,"flowCyBar" +2025,"May",137,380,"flowCyBar" +2025,"Jun",105,206,"flowCyBar" +2025,"Jul",256,375,"flowCyBar" +2025,"Aug",178,318,"flowCyBar" +2025,"Sep",161,261,"flowCyBar" +2025,"Oct",126,225,"flowCyBar" +2025,"Nov",168,267,"flowCyBar" +2025,"Dec",195,266,"flowCyBar" +2025,"all",1765,3476,"flowCyBar" +2025,"Jan",96,172,"reconsi" +2025,"Feb",147,254,"reconsi" +2025,"Mar",139,248,"reconsi" +2025,"Apr",121,286,"reconsi" +2025,"May",193,412,"reconsi" +2025,"Jun",150,244,"reconsi" +2025,"Jul",219,355,"reconsi" +2025,"Aug",168,286,"reconsi" +2025,"Sep",154,259,"reconsi" +2025,"Oct",132,240,"reconsi" +2025,"Nov",123,211,"reconsi" +2025,"Dec",190,260,"reconsi" +2025,"all",1705,3227,"reconsi" +2025,"Jan",151,266,"MACSQuantifyR" +2025,"Feb",120,221,"MACSQuantifyR" +2025,"Mar",111,223,"MACSQuantifyR" +2025,"Apr",169,331,"MACSQuantifyR" +2025,"May",193,387,"MACSQuantifyR" +2025,"Jun",164,281,"MACSQuantifyR" +2025,"Jul",210,319,"MACSQuantifyR" +2025,"Aug",170,295,"MACSQuantifyR" +2025,"Sep",146,246,"MACSQuantifyR" +2025,"Oct",129,243,"MACSQuantifyR" +2025,"Nov",128,209,"MACSQuantifyR" +2025,"Dec",125,190,"MACSQuantifyR" +2025,"all",1625,3211,"MACSQuantifyR" +2025,"Jan",141,222,"CytoMDS" +2025,"Feb",116,196,"CytoMDS" +2025,"Mar",107,194,"CytoMDS" +2025,"Apr",121,266,"CytoMDS" +2025,"May",152,347,"CytoMDS" +2025,"Jun",126,222,"CytoMDS" +2025,"Jul",180,263,"CytoMDS" +2025,"Aug",146,240,"CytoMDS" +2025,"Sep",126,208,"CytoMDS" +2025,"Oct",124,225,"CytoMDS" +2025,"Nov",112,188,"CytoMDS" +2025,"Dec",165,327,"CytoMDS" +2025,"all",1507,2898,"CytoMDS" +2025,"Jan",135,212,"CytoPipelineGUI" +2025,"Feb",112,188,"CytoPipelineGUI" +2025,"Mar",118,201,"CytoPipelineGUI" +2025,"Apr",132,278,"CytoPipelineGUI" +2025,"May",149,359,"CytoPipelineGUI" +2025,"Jun",131,225,"CytoPipelineGUI" +2025,"Jul",154,239,"CytoPipelineGUI" +2025,"Aug",127,228,"CytoPipelineGUI" +2025,"Sep",141,223,"CytoPipelineGUI" +2025,"Oct",122,225,"CytoPipelineGUI" +2025,"Nov",123,209,"CytoPipelineGUI" +2025,"Dec",142,207,"CytoPipelineGUI" +2025,"all",1471,2794,"CytoPipelineGUI" +2025,"Jan",126,204,"MAPFX" +2025,"Feb",114,188,"MAPFX" +2025,"Mar",112,199,"MAPFX" +2025,"Apr",123,247,"MAPFX" +2025,"May",136,293,"MAPFX" +2025,"Jun",129,223,"MAPFX" +2025,"Jul",172,255,"MAPFX" +2025,"Aug",182,273,"MAPFX" +2025,"Sep",117,206,"MAPFX" +2025,"Oct",116,204,"MAPFX" +2025,"Nov",106,184,"MAPFX" +2025,"Dec",157,234,"MAPFX" +2025,"all",1475,2710,"MAPFX" +2025,"Jan",145,229,"spillR" +2025,"Feb",111,184,"spillR" +2025,"Mar",103,194,"spillR" +2025,"Apr",118,236,"spillR" +2025,"May",156,316,"spillR" +2025,"Jun",138,248,"spillR" +2025,"Jul",126,221,"spillR" +2025,"Aug",147,245,"spillR" +2025,"Sep",123,218,"spillR" +2025,"Oct",122,209,"spillR" +2025,"Nov",97,176,"spillR" +2025,"Dec",153,213,"spillR" +2025,"all",1449,2689,"spillR" +2025,"Jan",129,207,"tidyFlowCore" +2025,"Feb",111,189,"tidyFlowCore" +2025,"Mar",111,196,"tidyFlowCore" +2025,"Apr",117,255,"tidyFlowCore" +2025,"May",115,306,"tidyFlowCore" +2025,"Jun",104,200,"tidyFlowCore" +2025,"Jul",139,228,"tidyFlowCore" +2025,"Aug",130,234,"tidyFlowCore" +2025,"Sep",124,224,"tidyFlowCore" +2025,"Oct",112,210,"tidyFlowCore" +2025,"Nov",110,190,"tidyFlowCore" +2025,"Dec",132,193,"tidyFlowCore" +2025,"all",1350,2632,"tidyFlowCore" +2025,"Jan",39,84,"CyTOFpower" +2025,"Feb",37,46,"CyTOFpower" +2025,"Mar",60,76,"CyTOFpower" +2025,"Apr",57,95,"CyTOFpower" +2025,"May",32,55,"CyTOFpower" +2025,"Jun",57,74,"CyTOFpower" +2025,"Jul",149,201,"CyTOFpower" +2025,"Aug",139,295,"CyTOFpower" +2025,"Sep",136,233,"CyTOFpower" +2025,"Oct",110,211,"CyTOFpower" +2025,"Nov",135,239,"CyTOFpower" +2025,"Dec",197,275,"CyTOFpower" +2025,"all",1085,1884,"CyTOFpower" +2025,"Jan",116,211,"tidytof" +2025,"Feb",103,173,"tidytof" +2025,"Mar",103,192,"tidytof" +2025,"Apr",112,248,"tidytof" +2025,"May",142,333,"tidytof" +2025,"Jun",150,261,"tidytof" +2025,"Jul",164,270,"tidytof" +2025,"Aug",137,237,"tidytof" +2025,"Sep",141,231,"tidytof" +2025,"Oct",61,91,"tidytof" +2025,"Nov",23,24,"tidytof" +2025,"Dec",33,34,"tidytof" +2025,"all",1198,2305,"tidytof" +2025,"Jan",0,0,"SuperCellCyto" +2025,"Feb",0,0,"SuperCellCyto" +2025,"Mar",0,0,"SuperCellCyto" +2025,"Apr",0,0,"SuperCellCyto" +2025,"May",0,0,"SuperCellCyto" +2025,"Jun",0,0,"SuperCellCyto" +2025,"Jul",0,0,"SuperCellCyto" +2025,"Aug",0,0,"SuperCellCyto" +2025,"Sep",0,0,"SuperCellCyto" +2025,"Oct",101,190,"SuperCellCyto" +2025,"Nov",115,195,"SuperCellCyto" +2025,"Dec",128,195,"SuperCellCyto" +2025,"all",336,580,"SuperCellCyto" diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorFlow.csv b/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorFlow.csv new file mode 100644 index 0000000..5e2537f --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/data/BioconductorFlow.csv @@ -0,0 +1,69 @@ +"package","since","license","version" +"flowCore",19,"Artistic-2.0","3.22" +"cytolib",8.5,"AGPL-3.0-only","3.22" +"flowWorkspace",14.5,"AGPL-3.0-only","3.22" +"ncdfFlow",14.5,"AGPL-3.0-only","3.22" +"flowViz",19,"Artistic-2.0","3.22" +"FlowSOM",11,"GPL (>= 2)","3.22" +"ggcyto",10,"file LICENSE","3.22" +"openCyto",12.5,"AGPL-3.0-only","3.22" +"quantiseqr",4.5,"GPL (>= 3)","3.22" +"flowStats",17,"Artistic-2.0","3.22" +"CytoML",9.5,"AGPL-3.0-only","3.22" +"CATALYST",9,"GPL (>= 2)","3.22" +"flowAI",10,"GPL (>= 2)","3.22" +"diffcyt",8,"MIT + file LICENSE","3.22" +"flowDensity",11.5,"Artistic-2.0","3.22" +"flowMeans",16,"Artistic-2.0","3.22" +"PeacoQC",5.5,"GPL (>= 3)","3.22" +"flowFP",16.5,"Artistic-2.0","3.22" +"flowClean",11.5,"Artistic-2.0","3.22" +"flowPeaks",13.5,"Artistic-1.0","3.22" +"COMPASS",12,"Artistic-2.0","3.22" +"SamSPECTRAL",16,"GPL (>= 2)","3.22" +"flowVS",11,"Artistic-2.0","3.22" +"cydar",9,"GPL (>= 3)","3.22" +"flowMerge",16.5,"Artistic-2.0","3.22" +"flowTrans",16,"Artistic-2.0","3.22" +"distinct",6,"GPL (>= 3)","3.22" +"flowCut",5.5,"Artistic-2.0","3.22" +"flowMatch",12,"Artistic-2.0","3.22" +"flowBeads",12.5,"Artistic-2.0","3.22" +"flowTime",9,"Artistic-2.0","3.22" +"sccomp",4,"GPL (>= 3)","3.22" +"flowCHIC",11.5,"GPL (>= 2)","3.22" +"flowSpecs",6.5,"MIT + file LICENSE","3.22" +"DepecheR",7,"MIT + file LICENSE","3.22" +"treekoR",4.5,"GPL (>= 3)","3.22" +"flowBin",12,"Artistic-2.0","3.22" +"MetaCyto",8.5,"GPL (>= 2)","3.22" +"immunoClust",11,"Artistic-2.0","3.22" +"scDataviz",5.5,"GPL (>= 3)","3.22" +"cytoMEM",4,"GPL (>= 3)","3.22" +"flowPloidy",9.5,"GPL (>= 3)","3.22" +"plotGrouper",7.5,"GPL (>= 3)","3.22" +"CytoDx",8,"GPL (>= 2)","3.22" +"Sconify",8,"Artistic-2.0","3.22" +"flowPlots",15,"Artistic-2.0","3.22" +"GateFinder",8,"Artistic-2.0","3.22" +"flowGate",3,"MIT + file LICENSE","3.22" +"flowGraph",4.5,"Artistic-2.0","3.22" +"infinityFlow",5.5,"GPL (>= 3)","3.22" +"cyanoFilter",4.5,"MIT + file LICENSE","3.22" +"optimalFlow",6,"Artistic-2.0","3.22" +"CytoGLMM",4.5,"LGPL-3","3.22" +"scifer",3.5,"MIT + file LICENSE","3.22" +"cytoKernel",4.5,"GPL (>= 3)","3.22" +"CytoPipeline",3,"GPL (>= 3)","3.22" +"censcyt",4.5,"MIT + file LICENSE","3.22" +"flowCyBar",12,"GPL (>= 2)","3.22" +"reconsi",6,"GPL (>= 2)","3.22" +"MACSQuantifyR",6.5,"Artistic-2.0","3.22" +"CytoMDS",2,"GPL (>= 3)","3.22" +"CytoPipelineGUI",2.5,"GPL (>= 3)","3.22" +"MAPFX",2,"GPL (>= 2)","3.22" +"spillR",2,"LGPL-3","3.22" +"tidyFlowCore",1.5,"MIT + file LICENSE","3.22" +"CyTOFpower",4.5,"LGPL-3","3.22" +"tidytof",1.5,"MIT + file LICENSE","3.22" +"SuperCellCyto",0,"GPL (>= 3)","3.22" diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/data/CellCounts4L_AB_05_ND050_05.fcs b/course/03_InsideFCSFile/homeworks/claude-chew/data/CellCounts4L_AB_05_ND050_05.fcs new file mode 100644 index 0000000..e796175 --- /dev/null +++ b/course/03_InsideFCSFile/homeworks/claude-chew/data/CellCounts4L_AB_05_ND050_05.fcs @@ -0,0 +1,92 @@ +FCS3.0 58 33311 33312 57711 0 0#$BEGINANALYSIS#0#$BEGINDATA#33312#$BEGINSTEXT#0#$BTIM#13:55:29.85#$BYTEORD#4,3,2,1#$CYT#Aurora#$CYTOLIB_VERSION#2.22.0#$CYTSN#V0333#$DATATYPE#F#$DATE#04-Aug-2025#$ENDANALYSIS#0#$ENDDATA#57711#$ENDSTEXT#0#$ETIM#13:55:57.02#$FIL#CellCounts4L_AB_05-ND050-05.fcs#$INST#UMBC#$MODE#L#$NEXTDATA#0#$OP#David Rach#$P10B#32#$P10E#0,0#$P10N#UV9-A#$P10R#4194304#$P10TYPE#Raw_Fluorescence#$P10V#710#$P11B#32#$P11E#0,0#$P11N#UV10-A#$P11R#4194304#$P11TYPE#Raw_Fluorescence#$P11V#377#$P12B#32#$P12E#0,0#$P12N#UV11-A#$P12R#4194304#$P12TYPE#Raw_Fluorescence#$P12V#469#$P13B#32#$P13E#0,0#$P13N#UV12-A#$P13R#4194304#$P13TYPE#Raw_Fluorescence#$P13V#434#$P14B#32#$P14E#0,0#$P14N#UV13-A#$P14R#4194304#$P14TYPE#Raw_Fluorescence#$P14V#564#$P15B#32#$P15E#0,0#$P15N#UV14-A#$P15R#4194304#$P15TYPE#Raw_Fluorescence#$P15V#975#$P16B#32#$P16E#0,0#$P16N#UV15-A#$P16R#4194304#$P16TYPE#Raw_Fluorescence#$P16V#737#$P17B#32#$P17E#0,0#$P17N#UV16-A#$P17R#4194304#$P17TYPE#Raw_Fluorescence#$P17V#1069#$P18B#32#$P18E#0,0#$P18N#SSC-H#$P18R#4194304#$P18TYPE#Side_Scatter#$P18V#334#$P19B#32#$P19E#0,0#$P19N#SSC-A#$P19R#4194304#$P19TYPE#Side_Scatter#$P19V#334#$P1B#32#$P1E#0,0#$P1N#Time#$P1R#272140#$P1TYPE#Time#$P20B#32#$P20E#0,0#$P20N#V1-A#$P20R#4194304#$P20TYPE#Raw_Fluorescence#$P20V#352#$P21B#32#$P21E#0,0#$P21N#V2-A#$P21R#4194304#$P21TYPE#Raw_Fluorescence#$P21V#412#$P22B#32#$P22E#0,0#$P22N#V3-A#$P22R#4194304#$P22TYPE#Raw_Fluorescence#$P22V#304#$P23B#32#$P23E#0,0#$P23N#V4-A#$P23R#4194304#$P23TYPE#Raw_Fluorescence#$P23V#217#$P24B#32#$P24E#0,0#$P24N#V5-A#$P24R#4194304#$P24TYPE#Raw_Fluorescence#$P24V#257#$P25B#32#$P25E#0,0#$P25N#V6-A#$P25R#4194304#$P25TYPE#Raw_Fluorescence#$P25V#218#$P26B#32#$P26E#0,0#$P26N#V7-A#$P26R#4194304#$P26TYPE#Raw_Fluorescence#$P26V#303#$P27B#32#$P27E#0,0#$P27N#V8-A#$P27R#4194304#$P27TYPE#Raw_Fluorescence#$P27V#461#$P28B#32#$P28E#0,0#$P28N#V9-A#$P28R#4194304#$P28TYPE#Raw_Fluorescence#$P28V#320#$P29B#32#$P29E#0,0#$P29N#V10-A#$P29R#4194304#$P29TYPE#Raw_Fluorescence#$P29V#359#$P2B#32#$P2E#0,0#$P2N#UV1-A#$P2R#4194304#$P2TYPE#Raw_Fluorescence#$P2V#1008#$P30B#32#$P30E#0,0#$P30N#V11-A#$P30R#4194304#$P30TYPE#Raw_Fluorescence#$P30V#271#$P31B#32#$P31E#0,0#$P31N#V12-A#$P31R#4194304#$P31TYPE#Raw_Fluorescence#$P31V#234#$P32B#32#$P32E#0,0#$P32N#V13-A#$P32R#4194304#$P32TYPE#Raw_Fluorescence#$P32V#236#$P33B#32#$P33E#0,0#$P33N#V14-A#$P33R#4194304#$P33TYPE#Raw_Fluorescence#$P33V#318#$P34B#32#$P34E#0,0#$P34N#V15-A#$P34R#4194304#$P34TYPE#Raw_Fluorescence#$P34V#602#$P35B#32#$P35E#0,0#$P35N#V16-A#$P35R#4194304#$P35TYPE#Raw_Fluorescence#$P35V#372#$P36B#32#$P36E#0,0#$P36N#FSC-H#$P36R#4194304#$P36TYPE#Forward_Scatter#$P36V#55#$P37B#32#$P37E#0,0#$P37N#FSC-A#$P37R#4194304#$P37TYPE#Forward_Scatter#$P37V#55#$P38B#32#$P38E#0,0#$P38N#SSC-B-H#$P38R#4194304#$P38TYPE#Side_Scatter#$P38V#241#$P39B#32#$P39E#0,0#$P39N#SSC-B-A#$P39R#4194304#$P39TYPE#Side_Scatter#$P39V#241#$P3B#32#$P3E#0,0#$P3N#UV2-A#$P3R#4194304#$P3TYPE#Raw_Fluorescence#$P3V#286#$P40B#32#$P40E#0,0#$P40N#B1-A#$P40R#4194304#$P40TYPE#Raw_Fluorescence#$P40V#1013#$P41B#32#$P41E#0,0#$P41N#B2-A#$P41R#4194304#$P41TYPE#Raw_Fluorescence#$P41V#483#$P42B#32#$P42E#0,0#$P42N#B3-A#$P42R#4194304#$P42TYPE#Raw_Fluorescence#$P42V#471#$P43B#32#$P43E#0,0#$P43N#B4-A#$P43R#4194304#$P43TYPE#Raw_Fluorescence#$P43V#473#$P44B#32#$P44E#0,0#$P44N#B5-A#$P44R#4194304#$P44TYPE#Raw_Fluorescence#$P44V#467#$P45B#32#$P45E#0,0#$P45N#B6-A#$P45R#4194304#$P45TYPE#Raw_Fluorescence#$P45V#284#$P46B#32#$P46E#0,0#$P46N#B7-A#$P46R#4194304#$P46TYPE#Raw_Fluorescence#$P46V#531#$P47B#32#$P47E#0,0#$P47N#B8-A#$P47R#4194304#$P47TYPE#Raw_Fluorescence#$P47V#432#$P48B#32#$P48E#0,0#$P48N#B9-A#$P48R#4194304#$P48TYPE#Raw_Fluorescence#$P48V#675#$P49B#32#$P49E#0,0#$P49N#B10-A#$P49R#4194304#$P49TYPE#Raw_Fluorescence#$P49V#490#$P4B#32#$P4E#0,0#$P4N#UV3-A#$P4R#4194304#$P4TYPE#Raw_Fluorescence#$P4V#677#$P50B#32#$P50E#0,0#$P50N#B11-A#$P50R#4194304#$P50TYPE#Raw_Fluorescence#$P50V#286#$P51B#32#$P51E#0,0#$P51N#B12-A#$P51R#4194304#$P51TYPE#Raw_Fluorescence#$P51V#407#$P52B#32#$P52E#0,0#$P52N#B13-A#$P52R#4194304#$P52TYPE#Raw_Fluorescence#$P52V#700#$P53B#32#$P53E#0,0#$P53N#B14-A#$P53R#4194304#$P53TYPE#Raw_Fluorescence#$P53V#693#$P54B#32#$P54E#0,0#$P54N#R1-A#$P54R#4194304#$P54TYPE#Raw_Fluorescence#$P54V#158#$P55B#32#$P55E#0,0#$P55N#R2-A#$P55R#4194304#$P55TYPE#Raw_Fluorescence#$P55V#245#$P56B#32#$P56E#0,0#$P56N#R3-A#$P56R#4194304#$P56TYPE#Raw_Fluorescence#$P56V#338#$P57B#32#$P57E#0,0#$P57N#R4-A#$P57R#4194304#$P57TYPE#Raw_Fluorescence#$P57V#238#$P58B#32#$P58E#0,0#$P58N#R5-A#$P58R#4194304#$P58TYPE#Raw_Fluorescence#$P58V#191#$P59B#32#$P59E#0,0#$P59N#R6-A#$P59R#4194304#$P59TYPE#Raw_Fluorescence#$P59V#274#$P5B#32#$P5E#0,0#$P5N#UV4-A#$P5R#4194304#$P5TYPE#Raw_Fluorescence#$P5V#1022#$P60B#32#$P60E#0,0#$P60N#R7-A#$P60R#4194304#$P60TYPE#Raw_Fluorescence#$P60V#524#$P61B#32#$P61E#0,0#$P61N#R8-A#$P61R#4194304#$P61TYPE#Raw_Fluorescence#$P61V#243#$P6B#32#$P6E#0,0#$P6N#UV5-A#$P6R#4194304#$P6TYPE#Raw_Fluorescence#$P6V#616#$P7B#32#$P7E#0,0#$P7N#UV6-A#$P7R#4194304#$P7TYPE#Raw_Fluorescence#$P7V#506#$P8B#32#$P8E#0,0#$P8N#UV7-A#$P8R#4194304#$P8TYPE#Raw_Fluorescence#$P8V#661#$P9B#32#$P9E#0,0#$P9N#UV8-A#$P9R#4194304#$P9TYPE#Raw_Fluorescence#$P9V#514#$PAR#61#$PROJ#CellCounts4L_AB_05#$SPILLOVER#54,UV1-A,UV2-A,UV3-A,UV4-A,UV5-A,UV6-A,UV7-A,UV8-A,UV9-A,UV10-A,UV11-A,UV12-A,UV13-A,UV14-A,UV15-A,UV16-A,V1-A,V2-A,V3-A,V4-A,V5-A,V6-A,V7-A,V8-A,V9-A,V10-A,V11-A,V12-A,V13-A,V14-A,V15-A,V16-A,B1-A,B2-A,B3-A,B4-A,B5-A,B6-A,B7-A,B8-A,B9-A,B10-A,B11-A,B12-A,B13-A,B14-A,R1-A,R2-A,R3-A,R4-A,R5-A,R6-A,R7-A,R8-A,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000001,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000#$TIMESTEP#0.0001#$TOT#100#$VOL#30.31#APPLY COMPENSATION#FALSE#CHARSET#utf-8#CREATOR#SpectroFlo 3.3.0#FCSversion#3#FILENAME#/home/david/Documents/CytometryInR_Sid/course/02_FilePaths/data/CellCounts4L_AB_05-ND050-05.fcs#FSC ASF#1.21#GROUPNAME#ND050#GUID#CellCounts4L_AB_05-ND050-05.fcs#LASER1ASF#1.09#LASER1DELAY#-19.525#LASER1NAME#Violet#LASER2ASF#1.14#LASER2DELAY#0#LASER2NAME#Blue#LASER3ASF#1.02#LASER3DELAY#20.15#LASER3NAME#Red#LASER4ASF#0.92#LASER4DELAY#40.725#LASER4NAME#UV#ORIGINALGUID#6421e78f-1a7c-4dbc-a033-693f7f1ecc72#P10DISPLAY#LOG#P11DISPLAY#LOG#P12DISPLAY#LOG#P13DISPLAY#LOG#P14DISPLAY#LOG#P15DISPLAY#LOG#P16DISPLAY#LOG#P17DISPLAY#LOG#P18DISPLAY#LIN#P19DISPLAY#LIN#P1DISPLAY#LOG#P20DISPLAY#LOG#P21DISPLAY#LOG#P22DISPLAY#LOG#P23DISPLAY#LOG#P24DISPLAY#LOG#P25DISPLAY#LOG#P26DISPLAY#LOG#P27DISPLAY#LOG#P28DISPLAY#LOG#P29DISPLAY#LOG#P2DISPLAY#LOG#P30DISPLAY#LOG#P31DISPLAY#LOG#P32DISPLAY#LOG#P33DISPLAY#LOG#P34DISPLAY#LOG#P35DISPLAY#LOG#P36DISPLAY#LIN#P37DISPLAY#LIN#P38DISPLAY#LIN#P39DISPLAY#LIN#P3DISPLAY#LOG#P40DISPLAY#LOG#P41DISPLAY#LOG#P42DISPLAY#LOG#P43DISPLAY#LOG#P44DISPLAY#LOG#P45DISPLAY#LOG#P46DISPLAY#LOG#P47DISPLAY#LOG#P48DISPLAY#LOG#P49DISPLAY#LOG#P4DISPLAY#LOG#P50DISPLAY#LOG#P51DISPLAY#LOG#P52DISPLAY#LOG#P53DISPLAY#LOG#P54DISPLAY#LOG#P55DISPLAY#LOG#P56DISPLAY#LOG#P57DISPLAY#LOG#P58DISPLAY#LOG#P59DISPLAY#LOG#P5DISPLAY#LOG#P60DISPLAY#LOG#P61DISPLAY#LOG#P6DISPLAY#LOG#P7DISPLAY#LOG#P8DISPLAY#LOG#P9DISPLAY#LOG#THRESHOLD#(FSC,50000)#TUBENAME#05#USERSETTINGNAME#DTR_CellCounts#WINDOW EXTENSION#3#GB38zCFDG\D%E#E¾EJFeMEDDʢDoCo,CD'I I7JDdsCDN]D]DpMD`,EEGFAFF3EE +DDAUØGCCaG`CQgCMC5DDRvEnE@rEWGF E DCD$tCqGDI/I"'DvDlDqDE9EEG>G@G$JF!CEaEP-E~ENDI^II)+I=éD~DEqH}1HhG\KF0FzFl+EdE> E5܅DEǘC64CZC9D,+\Af0DLhGKC/Dq:%EU(EEFB +FF^HGLF[RED?DqDhDdD+/IIEG@E~wE&E$EEp"F_HJ80GpGAFw\E(EEEDI*I$bIIѴqDŁD_F::HHtYH =1GBrF嗍F5FD`vEEkEGbEA)E6E<-E 9DW=D.7CD'D7GˀB!DD60D/EEEΌEGF% DDu)DA~D5C9[IMIsDueDBDƕeD4DǴDC`E^hrG%GGnGFEkEEDAD^VC~IQԐIq#IC Ib{D +qDlEHHG C%CVEAGWGPGoGzgDDEsgDQGz!F"D+=DCCJ'CLH˯IQ*Eh3`FlG0'uF +FmbFwFHGTѭG-TUFߟEp/kE:]DaDD1I"IGQH7 HќDœID];EH-HAá[2!8GSGOKC[݀. BC7pCf.BXgC{8C'Q¤%AWCj)CyGG~lGLGIȃCMkBA\CD/CBԣCYNC=-@P^M $~-GBlB&I-DC!H'ˀDa{DEjGEEFOlF0Fs)GqFEED=D*DOfD$k#IJMEZ EcEEEEr`E(H1GGcigFiZEeEk]E#8EDfIJ +IոIQ[DaDp F7HӀ#HPGvG/FuFFuEEdªE}EE?EjE$ǨE"DnDD +DVHH(CesCFdD6D~E +Es EEtQHFڝE +D{D(1DwCMC2,II>8D1D,DD1JD]DEq_GAGFF(E6 E/XEPDDz1DīIFRIiUH]IsDCDy Eg;HewGܛGfFFBTF4LE]EEWDFDDmÙCS6CC".CDQ^W¼H$¹8 Qo[C2DɹA)C$|UC\%B\CCB2ppGwH&CwqAlCCA+CgCYvfCD ?qCCHHBg~CGٸD +‚1AIc&0G:GGEH}CKQCRDHD{CKQ@2C&hBNt&W=CS®2 A2BjvBw/V@C]pŠC#O]69UH;CvCqDIC\DeDQEZEF0EgDCCCX\…C`H`ID(C;DD9GDD5E"ƕGFϋlFEiEW.DrGD~DICI4I9HI7D}DΕ9EVHLG~G-F}FFW&EtDַDlCDCBOBUCVH\D Rx>(BzWHHwCSZCDoE$E6/EF +ExbGWF\-tEduDD;!Da FD):XC IMIsfDsDDD,E%4E +E0HGhAG:dF:ENEc ?EE +]DyIO}IIIA@InNKE3%wDOeFXHmH))GٰG +DF\FԞF EIEjE yDY\BBD +$)=Cn$QCw!C +hGNCCDHDE# .EKEXElG7tF8?wE0Do Dj/CdDlCWI#VI>k +Dy&DDpE6]E `DQEXGG@KGFLEIEP*D}DlaC`IIII8sC|D_YE6HtHG~Fv"FIFrc6EԓEEAKE4eD՞DMõ4CQVByTCfCeco-BιB_GCYCT C_C"DKCD=(DbhE{wjD'D ZBCEC Cp:C\HIFmD%E7TEb,EA|E9DEaF4|EEaHDfDCCoCJC +XD1I[`IՇHI[}{DQ|Dq)FF@;6ERE LDODYD<$DmC,=Dc=D~C4D +D w¡HB +RC H,@A:NC]BmvC‹B[9C^/C4EMDDG!Do[B{CMOBG^HVWCxC6 ?CdfCVBj}DF~FE""D;DBŽB1C} GCpGGGЇGsDB^oD]GK> +F%FZhEb(EHB +E&Dk΀DD#C,ݤBlC-]ECp¼ͯh +Ak[vLG +fOOA#CA@oB#ClDG=DN>C[C;aCB*CB2APC_YHWmDYCDQD{@DDQDSC7=$yC:B4$C91HbvH}OHY{HtC`eCCEHD+BۢCoGCF/sEsVDD8#DD8DbDvE GGHz#G/FaEkLD=DHaDCIHImWH^@I QDID$3EEHHkG)OF|FF{JE;EUAD18EDC2BSßBaGGiֲC\&„ŜGb<A?CCC0Dt.BD{CB̞CxC7@Ϟ³yÎKn GHB䶈>RH6CKfC^CPCM(C;3HvG헇GFęF[%FA >EE/TDDDEE EPhEuE&5tDXDEVDǸHC `CֹD DFE 8EFE'lG9F3E D]JCW +DCC|[Cb[I6ZIgADȝxD EDEGEE˻HoGQG"F GEF#EDD֣Dv.DdaC +I#I:>H|0H$D)D%EBkGGwG vFHEEMXEkPDDoDF6DcCL~mD5D<&CfC|CwBDZQH^8|ôu@䙹BiahCBJ>C61C!C¤nW5<+$GcSGZ+B C77CTCHChBwD9C׃uC4qBdXACs+eCC1GGGGC~LCp6 P D9CBδ[Cg}BPCU@~xCxCr'CyC%n5hNHB!CCͳHcCAC&MB_=[$FCPiGGрGw0CmD7uCCWVCg‚oChDvDDRfCMC9jF6 DC15$CMG[G)GGBsB8BHD^/D^C5_C CO^Cu9C `PxCCúg>>@C +C)7¤’9HrBlsܙC:C'wDS DLLDOoDcmHD|rCRCQ!HNC>rmC{H/HōC&DHshDEEW;H4GG$FiEvFEzE GDDsD7CTWBSAwYBYwXD6JH'9&!CHAToCBECe3DuD-G/ѯF,صEQDC<CCC+/HI CCDD$DGD%EOG)G: Gu+F E[p?EgDADÊDRI6ISYH&H攞D4De^EǶH'H GlFfFqwuFiEࣜE-E 8DϩDC!DC3C.ACC9C]ŭDO#mAte;CT(CD sD:LCYhRDIAÇ=}CʓIChG}G*C CCCYCZr >CCD[D@pLD&BCz'e()My_C~GBGwwGGC')'CE^8DDQCȞCTCO^J^GCkMC$ʼnC,]B~$B\)BCpvi)"HuC)†{BB?C^C%\MC"YAB7C6ǝB?_C}é_CZGGeABvD +CbCC +BwCCCGCnCxC/kCb=̒JD;CG`GjG|G/CQBBT)C2yC_CiZiBh!CSVC@f‰`~HCB$BxA;# +CxhC.C"H?-`2jͱCZOCy6BRCUDuKCZ>D B|YC%dBq +AC@dFG߀GY0D ;Ù8B/]Cj}CeAhD"CgnCeKC,ۿC2µBGGGGGBC9@BD{5D5D!C +{CC9 "CVuB̴CCj\%ʆAJt>{\C<)ÿSé2 H D ;DS'E yELTE^EIFT`FGfpdFf%Eq8D0DLD,D kCT~I0IiE pEdET8EE7LE>E7H0cGӥGaF](E[ELEkEDjI`I-II֝D{DFHMBHSGG-FxFeF*EE]wEAE6qEE>#E0DV=D՗COD@e#DSb/GBtCm?ߋ%Cr7D/@\D+tCy@CPg"'Ch)IEAtHHQCaD7D{D +CQqD#C{BD3)CCSCr&CV]CrB]XHKZ@HLHw@DKJDaDDĜECE~E /E9G7F +E!D D DWCqCHIdÐIDŇRD| +E4+EtE4Y"EEBGzGFҍEdE"jE%+DǿbEDaIPI-XI]ID$DyxE._H6GKiGPЍFF!F&0EDDDs|DBtC`cUATC(C[OAtHtD/D@՘DDEU*LEEEqG'BF EDCKCDHǕCأTH9I+jD+D DDJcD Dҝ=EQIG2G'GRF{ELDYDUDKDIII bI'DVQD\E۫HG"G_sFφF`FYBEƺ Ec=DOESDCousCAsC06s%0BMC~CfԠGZ_}C=d؄S/ C"C|@D[E}8B^AVG C(CVGG6brCCAC3CjMC +CCLÍnBVVC? 1C~N)YBZCG܀GGGGBA;}BYD#oB7B.­@B35Cm^eCTCJ\@^C[C:=AɺnBD @F@DUDbWXDO|E6 EFE@>G'cNF*=HE0DcDy20D&?D1B|X|Hz IgDDyDD[^fDqDEq{$GG!MFdE% EK8`E D{D*ZCIIO'II7BD3uPDUEHa0GGFJFTbbFPeEā E0%AE8fDŁDȥC~BC4ܨ9=CnlCKDƉH§>+eYC=͕BRCC\5CM(B ?-ÎR‚ÅCBOGG/FCP`ۗhC>rBϚCCsCi.DeCC^A~C +:B +ߢC[/€%GhGx|GGQC+DD9/A53A[ '!BS@BpCCcSB)a^\)%SßkAo11H]CAC"GªeC5Cq+B:qCW.CMC4CC8BG C +G!G0®C"I¹#CC B̟C*CAaC\jB  xqӲA*5–PGhGb<G):G$&B>CC{L{D1DBCWCW/B00MGnuB9C%APC_C;C o@BeI&Íq U1HDCDC4gCk~CnC3BkBCDCyB >rm{GGWC}F-Cl=x BZٳC%'CaeDåB_BLhCCBrŠsCNt GG`G_Gׂ@Bb;B`ĎñQCUPC3BOB܀CG̽T4eCBCqv5kB33C&`CKGC%k)!H/}Ba¯OCӢϟBaCF%zCRD:sCqZAT]A] )G8H0CDXZC"J˜-2CJîDzD_C$BBF‡B?CC'4GˀGŽHH mD +C^²D{DDzDP'CCPCHvAkCXbBLCC'åB+C]pCB@”t(׊Q G$_BF7!CaICC,DO"7DD)DypCC bB}^BCktB1C?$CS3 ̺BBXC\H@CBCm+Dq0DR}EQEcE3cEG-WF.EDLDQFD&D)}CrI I)ΥD,$D"TD 2DEdD*EBG6GD4=G#`FwEYڌE4QDΐDDIw0IAII-pDEI[DD#Y:CęCܛI(ID.MNC{DKDDDBE_GƕG GnFE@EDDj-C(II=I<I=?DZD/E;HiS0GG FwFKxF8EE'*DYD,DC_)T˜\ØB"pA>s? GCeCߎDDE +EEE\G0JF)E lD؇DIqXDP"D +BH`Is`Di\DDD^DanDWDc\EyGG*zAG{FVE?*DpCD %DI^I#HI&DDhA*EH~G4GFUF]FPF,E]E +2EDUX4DbCC*#fC ½!oWEs}CxչžA̕CCCC!qCCJC+x0±FCnCgmCLGGCgaD $C;=¤CfnDD°CL.wD Cq0AeCZCyCCGG5tGCG̒BaCqD*[BCzECBo(C A]C]{onCmCa[B—x:x(^7i@߻7CAdGC3CsC\BʁBCD  )ChFC +&B`BO 3WC:.G2G⮽"C~B~ ¶ݦ?w@SC80D;CvC0B]{DJBG/sG[G}AQGUGZ`B9>¹T'CCfC쌟CIV[B0Aۧtîs=B9(BxqBB>=%_#,8Bh[H>l?C/M}bDHjBD>wDOE%g|E/3FrEDXCgCã}DSDD%H,`HۅLD4q8DnDD*D{DECIGTcF#FEE D@D]UDJ]KC'IF]`IhHHDwcDEH+GζGCF`FCFEmՖDCDrDp1Dh!4vB۬CBz"CB!;2ÊcH`|@ESEOF4FnF +G!GGNKG.FF Ex˕EFE7qEDĥJJGD YGUmGeЋGhFxFGGpG^fG@FEuEDE@UEE=(IJ@fQJJEEYDc/H/"CCNBChD$AD-DȟG }xFJE ưDX:{D+DDICBvC͜SHݮ@IDSJD|ODD2hDDEMKGޞgG0G FgE4ٱE%4DDcDׅI(IXwH`HKDr]D$Ej3H5HG^FFw FfkEכE1E7wWDOE3A%CkBJ4CQC0C )C¸v5HgBP…qCD,B0DeEIEZ E?e\G%ʒF#$E +D$1QC_BB+BH#I%D|$DÅDgDGE DEOHGlG<.`F.@Ej E;DDhZD8IQIQHBHFDZuDEO.H%/H-GGFeFEFEE?BE)qE,5CaB9CTo—}C!/C3G0BĘÀBBtC4FCіCCȤCm{CB =CCs¹>CB]?QH HZCIˆZôC9CeCҒDwC?FC8Iz HCRCm{qGG`|GGChC\DauCȿC FC +gcCifҘC|Ca/ðWa߀C 9_B֬V•BysBCYN}C"G9C~D8=Df3VD!EE]4EP[EfFʅED6Ci}CL3C!YCIúHIDpD?yDDDDENeG#jG +*FE&E>E,L ElD/CPI8IAII.2DADEkHZG)GpʃFF;hF8JE%EFE(GDӿDQDAnCs(C;ˆ{C"_C/{CFC[C)BcC=CkC%*DGDDEAy?:\ASC v圄CGG|CA+CbVSµdÄ- GlGzGG+j CkC8FL"EE(-DlD2rDLCiC6CDI‰gk^C3TCB_@~4HD CDRD#EEjF `EsG,F/E3MDgDJCC`DI1`I[7D74D2D>DEJ9DEmGG.mG +\FOE]DDDiD wI&IwIEItjBDD~5'E,H(TGGFIFjeAFWE|/E%(E3]DDݝBD grCycCAH)BŇNGCDC tBvC DCLTDfDᇅFEYD`DDDiC̈́D|I&IF&D`S$DVDDzD$EERJKG;F"F'E˿EL E*D vE'DHI0I<{IUyDzD[E_EH2AGp!GK5FpF*"F @mERVE1DaDD> +Ct$CthCǶB{\BuDCqDJ6GB\e}RC~ +CC?dCw\CBC!BߩÂCIBCGohGCDM`C;C]:D C/C:CCjCC]@ yNCAHCGjGG_4G_C`JCةD oC8BCƞCACGB';B<FnC G0:ƏCg1)BKqCu?)CODyCHC6qC+kuC£]BB CaZHstHuFC. sCЧIA"A!QBӽBD CѹC]9B4 +C@''BoGCM GygG{HiHnC9¬BRDDCUC#DB0~HrCl?C^N`ZcC6<7ØU\BỎBCФIyz}%DH~DGPE2|EʹF$UjFiFG1!FH GFR\EE7E]DbDIJ`XE#E +oF(FFFpxFgH[H*H GWFR-F E?ED BIJHIxJN]EEOF$MI;I5HxG9&GpGTmFF'*F EEEnEXgE0wEcEDD+DD5F<@BPBx)CBBCC)Cl C\0BbouCj`$Ac5H.f@H,C\yÄvCC@BKC;C.D @CYEC|]CBeCʘC|xAl]wAo5GGH1HC\Ux=oCĤCIgA}7BCVXC"}C(&o@J=e-^D*a4btCw1CHK–%2_:7±~gGʀC% %B:`BBߙB|Ž)CJDsBC GCClED"ED{DEKEEG)?F5E _DdD'CCDK+HI +&DCDD;6D]EHDhEf-}GGJ~4G$zFwEykE jDD$$C[;IHII +f I"uDzPD\E׺H'H4AGI FIFWF{VE4(E/E#Dr5E!CH{ÄCU>fBS["Ci>rHbCߔCQDF D[oDoEkLcEpE9Gs/F#SED4DjDUCBFIpI,i?DND|D$D`E6Dj+EIGRG:G3mFEpE-DD9DI~C0I]I`IDD7EH~H ,GFXFHF\EEG7EHnD 3DfCmnOBkB{CRC@#n[H;@C2Yy!DBJ CUCD~DbטC3DC5Ak @jBù`BpGHG@lC>\3[(C W BC/D_CvjB]\@BR{BjÀZC^0AB#gH ;H G1G>xBЖcBC3DJ D78C]GCCj@_CZd9#0?*B ɥBo{QB CQfIC^GiG$D%DE]EZF FdF]FgssG VDF"W!E=DDwaDCNCEI]I6DjxEE)EsEJ{DdEIOG9FIFE^DDeDD/ŒʀIdIItQIlDԷD\%EٟH&CGG,TFoLGF +%cE .EzJ>DtDѠDCCgB""NB^D2mõ~LB#-*EHACzDqE.FEEFF%F4GMcFOEVDZDȣDpD"4D,II_EE_|EiE5EnE7EݷcHkGR?G+vF@1E E>DR5D$IXI.IID*pDEHMH GtFFFBE2zEfdEsDrEEHEc؟EDD1DDUD`GC*BG1C~U"B#BŒCƌCCɅCB CW!3sªiB![1iG֓G hCPLÓC0`D >CpC"+C B@gC +B2cÞNK±CCO]tGGCH HLo[žQHDCQD) +C(COAGAkiæC}þ1¥BPbB33dËC-%H %¼iD#D\|RDDvEH=E0EOHFEDx2CBvDzmCwI&XICݤDgD"lDDDMDыCDN"EY87G|EFHFŮ!EE98D'DV_DZ1D_ IRIwr,I I)8_D)C/EfH7GGOFHF$FXEE S3DDy]DCdCVP +C Rh#C> +C0HDTnCu!DPDωE,+E>F >EdMG^AF[EG&DaDUDq%DyC)I,@IQ!DbeCfD[VD,/EzE*EdH +~G\G2pTF5sEEdEDDzGIIOI"@I@DxDEëHHEGGF!F{fF1EvZE&j9E.D̺C ¯9B\heC{\CS݇TšQCIlHuhCaBBQC9`PC/CuDODDQ%CvʔCaŠ C.JBg^BC6H<@HOA%fEC#QB"B9FjICvD@؄Z{B7D"B$C ԛC(DG1F6[=E`Di$D:DCj5Cr9HVI+D4zD3D+D&Dx|gDbvE]$HGT G)FEBnE$԰DKD#zgCYIEeIfII!kVCDDEFHSH GC=FFrFQxE?Ee5EETDElCx.C CCˆ{Bl1CCqH >ěË!1&$DbDDE[@E$EDD"D`DD\ CLCqJxxJE&FG nF6Fsm6F#FE"FQF" F] EEEDtDDfqIvIJ\VJD[D@7EYWG FF*iEWE[lE*4D}D aDI͖D&yDU%D.DaDx DD6DoD0A*CGDFDOcD^^EE/صEzF LE?FlEED{DEDd\fClFCIiPI/DrAD}E%ƢE&gEgxE=MEGFDF$ElE$rD QDabDCQIwII `II1D1D +EחHDGÂG\MFiF*FEUE6hDDDTACBC{C@C6i\@HUBBdBwb6fDҥD#DmC_CbgD!B +z}3BhECo7(CB/bÎBAfhBinCsrEB85WHiB-=dHB#CG~C;eC%:CNBXЗCFABðCgoCzCSGGnKCa}AԀCo=B%CGf’BCBҾca.<\FC,fBڌ@TCuٰG%GGGF C5{„fC/D*#C{iCE˳Ci[Bi|Bd +CC"`AzñMCñAC=BϻúXCH&CB,1Di(kDDEwyEEG=JF8E:FXD֡D-1pD&CkHbI CYDfDCDt+DqDsKEsHMGF}GFEY]"E:rD$D̩CIIIIzDD̗E]pH:HGݑF5'F/IFyEEEE$DTD[KWCɽ_D!PDHjDDƱSEDnE|یGmG/:G EVEHE_D*DӺDOI]I|IRI+PDD.EbH SGcG 4F7FY_tF]6En=E1oED#4DjICU+C1{3hzA~Dl BH_Á#!'QC°C\C|D?DgD4~CEBCWOrC )CH^HvCC{.CI0CmCD7DZVD=CC8?,BBԩWH,HN"3H)H, mDerC6{CQHEyesEKD_CC[D6JC:DCtNzL4ËQBoC`CZ3Bw?#!WH|¾ jC +iD +o D/D}E**ETEXĐFX+E-wDԐD9iDKA3D8CH3HzCrD;+DvyD|aDQDpD GFNF2FwECDJD(DjB2B+IhIPHF`IDD0E5G켧GcG%F6iE ,EC*E0DD8DD*ŗCAC{e>BqCOB1Cb00000000 \ No newline at end of file diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_1.png b/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_1.png new file mode 100644 index 0000000..8b30c26 Binary files /dev/null and b/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_1.png differ diff --git a/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_2.png b/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_2.png new file mode 100644 index 0000000..b9a06c3 Binary files /dev/null and b/course/03_InsideFCSFile/homeworks/claude-chew/images/Problem3_2.png differ diff --git a/course/03_InsideFCSFile/images/BioconductorInkscape.svg b/course/03_InsideFCSFile/images/BioconductorInkscape.svg index 4c33795..bac460f 100644 --- a/course/03_InsideFCSFile/images/BioconductorInkscape.svg +++ b/course/03_InsideFCSFile/images/BioconductorInkscape.svg @@ -1,117 +1,117 @@ - - - -Mike et al. have2007Bioconductor Flow Cytometry Package + + + +Mike et al. have2007Bioconductor Flow Cytometry Package diff --git a/course/03_InsideFCSFile/index.qmd b/course/03_InsideFCSFile/index.qmd index edd6f44..f4df209 100644 --- a/course/03_InsideFCSFile/index.qmd +++ b/course/03_InsideFCSFile/index.qmd @@ -1,1117 +1,1117 @@ ---- -title: "03 - Inside an FCS File" -author: "David Rach" -date: 02-15-2026 -format: html -toc: true -toc-depth: 5 ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - -For the YouTube livestream recording, see [here](https://youtu.be/1wZ61x0i19o?t=278) - - - -For screen-shot slides, click [here](/course/03_InsideFCSFile/slides.qmd) - -
- ---- - -# Background - -Welcome to the Week #3! Having subjected everyone to two R-focused weeks, this week will have more of a cytometry-focus as we slice into an .fcs file. We will hopefully gather greater understanding of how an .fcs file is structured and what additional kinds of information we can retrieve (while becoming increasingly puzzled why different manufacturers insist on using different keyword names for the exact same things). - -We will also gain additional exposure to more object types in R (vectors, list, matrices and data.frames). Continuing the analogy from last week, if every function is the equivalent of a tool in a toolbox, each tool requires certain types of things to do its job properly (hammer ~ nail, screwdriver ~ screws, paintbrush ~ paint, etc.). Being able to identify what type/kind of object a particular variable we have created in R is will allow us to pass it to the correct function that will allow us to work with that object type. - -
- ---- - -:::{.callout-important title="Housekeeping"} -We are building off concepts that were covered in [Week #1 (Installing R packages)](/course/01_InstallingRPackages/index.qmd) and especially [Week #2 (File Paths)](/course/02_FilePaths/index.qmd). -For those who are flow cytometry beginners, please see [UChicago Flow](https://youtu.be/gC4brjHbLkk?si=li98x7KlLXUFWGX3) Flow Basics Series for additional context. -::: - - -:::{.callout-tip title="Today's Goal"} -If you find yourself at some point going "I have no idea what is going on", please pause, take a break, and circle back later in the day. Our goal is not to have you memorize how to quickly access 100 archaic keywords, but rather showcase a typical object exploration workflow. So don't power through, but rather circle back when you are in an exploring mindset. Consider what kind of information from within an .fcs file you'd like to retrieve, and then explore/navigate your way through the various paths until you find the information that you were looking for. -::: - ---- - -:::{.callout-important title="Housekeeping"} -As we do [every week](/course/02_FilePaths/index.qmd#new-repository), on GitHub, sync your forked-version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. From there, copy the data folder to a separate project folder you have created. This will prevent any merge issues bringing in new data next week. -::: - ---- - -# Walk Through - ---- - -## Getting Set Up - ---- - -### Set up File Paths - -Having copied over the new data to your working project folder (Week 3 or whatever your chosen name), let's identify the file paths between our working directory and the fcs files. If you retained the same project organization structure we had during Week #2, it may look similar to the following: - -```{r} -#| eval: FALSE -#| include: FALSE - -# Please note, this code-chunk is only for use when writing the code. Please switch eval to false and next code blocks eval to true before rendering - -PathToDataFolder <- file.path(getwd(), "course", "03_InsideFCSFile", "data") -``` - -```{r} -#| eval: TRUE -PathToDataFolder <- file.path("data") -``` - -```{r} -PathToDataFolder -``` - -
- ---- - -### Locate .fcs files - -We will now locate our .fcs files. As we saw last week, our computer will need the full file.paths to these individual files, so we will set the `list.files()` "full.names" argument to TRUE. - -```{r} -#| eval: TRUE -fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) -fcs_files -``` - -By contrast, if the "full.names" argument was set to FALSE, we would have retrieved just the file names - -```{r} -list.files(PathToDataFolder, pattern=".fcs", full.names=FALSE) -``` - -This would have been the equivalent of running the `basename` function on the "full.names=TRUE" output. -```{r} -basename(fcs_files) -``` - -
- ---- - -## flowCore - -We will be using the `flowCore` package, which is the oldest and most-frequently downloaded flow cytometry package on [Bioconductor](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry). - -```{r} -#| code-fold: TRUE -#| warning: FALSE -#| message: FALSE - -# I have attached this code for anyone that is interested in seeing how these plots were made. The content is not part of today's lesson, so if you are just starting off, we will cover the details of data-tidying and creating ggplot objects over the next several weeks. Best, David - -# Load required packages via a library call - -library(dplyr) # CRAN -library(stringr) # CRAN -library(ggplot2) # CRAN -#library(plotly) # Using the :: to access - -# Loading in the dataset contained within the .csv file -BioconductorFlow_path <- file.path(PathToDataFolder, "BioconductorFlow.csv") -BioconductorFlowPackages <- read.csv(BioconductorFlow_path, check.names=FALSE) -BioconductorFlowPackages <- BioconductorFlowPackages |> - arrange(desc(since)) |> mutate(package = factor(package, levels = package)) - -# Newer Base R Pipe : |> -# Older mostly equivalent Magrittr Pipe %>% -``` - -```{r} -#| code-fold: true -#| fig-height: 9 - -# Notice the code-chunk eval arguments above dictate the shape of the final rendered plot. - -# Taking the imported dataset and passing it to ggplot2 to create the first plot. - -plot <- ggplot(BioconductorFlowPackages, - aes(x = 0, xend = since, y = package, yend = package)) + - geom_segment(linewidth = 2, color = "steelblue") + - scale_x_continuous(trans = "reverse", - breaks = seq(0, max(BioconductorFlowPackages$since), by = 5)) + - labs( - x = "Years in Bioconductor", - y = NULL, - title = "Bioconductor Flow Cytometry R packages" - ) + - theme_bw() - -# Taking the static plot and making it interactive using the plotly package - -plotly::ggplotly(plot) -``` - -```{r} -#| code-fold: TRUE - -# Retrieving the names of Bioconductor flow cytometry R packages in correct release order. - -HistoricalOrder <- BioconductorFlowPackages |> pull(package) - -# Bringing in 2025 package usage dataset from a .csv file -BioconductorUsage_path <- file.path(PathToDataFolder, "BioconductorDownloads.csv") -BioconductorUsage <- read.csv(BioconductorUsage_path, check.names=FALSE) -BioconductorUsage <- BioconductorUsage |> dplyr::filter(Month %in% "all") - -# Note, dplyr::filter is used due to flowCore also having a filter function, which causes conflicts once it is attached to the local environment. - -# Combining both data.frames for use in the plot - -Dataset <- left_join(BioconductorFlowPackages, BioconductorUsage, by="package") - -# Rearranging the order in which packages are displayed - -Dataset$package <- factor(Dataset$package, levels=HistoricalOrder) -``` - -```{r} -#| code-fold: TRUE - -# Generating the 2nd plot with ggplot2 - -plot <- ggplot(Dataset, aes(x = since, y = Nb_of_distinct_IPs)) + - geom_point(aes(color = package), size = 3, alpha = 0.7) + - labs( - x = "Years in Bioconductor", - y = "Number of Yearly Downloads", - title = "", - color = "Package" - ) + - theme_bw() - -# Making it interactive with plotly - -plotly::ggplotly(plot) -``` - -flowCore is also one of the many Bioconductor packages maintained by [Mike Jiang](https://github.com/mikejiang). In many ways (as those who completed the optional take-home problems for Week #1 know) reminiscent of this [xkcd](https://xkcd.com/2347/) comic: - -![](images/BioconductorXKCD.png) - -As with all our R packages, we first need to make sure `flowCore` is attached to our local environment via the library call. - -```{r} -library(flowCore) -``` - -The function we will be using today is the `read.FCS()` function. Do you remember how to access the help documentation? - -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Or when in Positron, hovering over the highlighted function name within the code-chunk - -?flowCore::read.FCS -``` - -To start, lets select just the first .fcs file. We will do this by indexing the first item within fcs_files via the square brackets []. - -```{r} -firstfile <- fcs_files[1] -firstfile -``` - -## flowFrame - -For `read.FCS()`, it accepts several arguments. The argument "filename" is where we provide our file.path to .fcs file that we wish to load into R. Let's go ahead and do so - -```{r} -#| eval: FALSE - -read.FCS(filename=firstfile) - -``` - -Please note, if you are doing this with your own .fcs files, you will need to provide two additional arguments, "transformation" = FALSE, and "truncate_max_range" = FALSE for the files to be read in correctly. We will revisit the reasons why in Week #5. - -```{r} -read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) -``` - -In this case, we can see the .fcs file has been read into R as a "flowFrame" object. We can also see the file name, as well as details about the number of cells, and number of columns (whether detectors (for raw spectral flow data) or fluorophores (for unmixed spectral flow data)). - -![](images/00_flowFrame.png) - -Directly below we see what resembles a table. At first glance, the only column with an immediately discernable purpose is the one with the name column, which is listing the detectors present on a [Cytek Aurora](https://bpb-us-w2.wpmucdn.com/voices.uchicago.edu/dist/2/1824/files/2021/10/Aurora-Configuration.png). - -![](images/01_flowFrameDetectors.png) - -And finally, at the bottom we reach a line that tells us that for this .fcs files, 599 keyword can be found in a description slot. - -![](images/02_KeywordsFiveNineNine.png) - -
- ---- - -So let's get our bearings, we have loaded in an .fcs file to R, but let's use some of the concepts we covered last week to try to understand a bit about what type or class of object we are working with. From the output, we saw the words flowFrame object, so let's read it back in again, but assign it to an variable/object called flowFrame so that we can use the type-discerning functions we worked with last week on. - -```{r} -flowFrame <- read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) -``` - -As we create this variable, if we have the session tab selected on our right secondary side bar, we see it appear: - -![](images/03_SessionTab.png) - -If we were to use the type-determining functions we learned last week - -```{r} -#| eval: FALSE -#| include: FALSE -# This is the whole ball game -str(flowFrame) -``` - -```{r} -class(flowFrame) -``` - -flowFrames are a class of object with a structure defined within the `flowCore` package. They are used to work with the data contained within individual .fcs files. Looking again at the right secondary side bar, we can see that it shows up as a ""S4 class flowFrame package flowCore""" with 3 slots, with the words flowFrame adjacent to it. - -A perfectly valid first reaction to first reading this is "well how should I know what any of this means?". Powering through this initial discomfort, let's go ahead and click on the dropdown arrow next to the variables name and see if we get any additional clarity on the issue. - -![](images/04_Slots.png) - -When we do so, three additional drop-downs appear. Based on the previous line that mentioned 3 slots, we could infer that each line corresponds to one of those slots. - -What we are encountering with flowFrame is our first example of an S4 object type. These more-complicated object types are quite common for the various [Bioconductor](https://adv-r.hadley.nz/s4.html) affilitated R packages. - -These objects will usually appear with either S4 or S3 in their metadata, and are made up of various simpler object types that are cobbled together within the larger object, usually occupying individual slots. - -What advantage this bundling provides will be something we revisit throughout the course as you encounter more of these S4/S3 objects. - -
- ---- - -### exprs - -The first slot within the flowFrame object shows up with the name "exprs". For the exprs object, glancing at it's middle column, we can based on the 100 rows and 61 columns, that it is likely a matrix-style object. We might also recall we saw similar numbers in the printed output when we ran `read.FCS()`earlier. - -![](images/00_flowFrame.png) - -Which likely means that "exprs" slot is where the MFI data for the individual acquired cells within our .fcs file is being stored. Within Positron, for a matrix object, we can click on the little grid symbol on the far right to open up the table within editor. - -![](images/05_OpenTable.png) - -If we utilize the scroll bars, we can see that the individual detectors (in the case of uploading a raw spectral fcs file, they would appear as fluorophores for unmixed spectral or conventional fcs files) occupy the individual columns, which are named. The rows are not named, but number 100, matching the number of cells present in the .fcs file. Additionally, on the far left there is a little summary table about the overall data. - -![](images/06_TableInEditor.png) - -Let's go ahead and assign this matrix to a new variable/object so that we can explore it later. Since flowFrame is an S4 object, it's slots can be individually accessed by adding the @ symbol and the respective slot name. - -```{r} -MFI_Matrix <- flowFrame@exprs -``` - -Alternatively, we can use the Bioconductor helper function `exprs()` to get data held in that slot - -```{r} -MFI_Matrix_Alternate <- exprs(flowFrame) -``` - -In the case of the above, this displayed text output to the console would be unwiedly to display all at once. If we wanted to only see the first five rows, we could use the `head()` function, and provide a value of 5. - -```{r} -head(MFI_Matrix, 5) -``` - -This is much more workable, especially on a small laptop screen. We can see that there are names for each column corresponding to detector/fluorophore/metal depending on the .fcs file we are accessing. Lets retrieve these column names using the `colnames()` function. - -```{r} -ColumnNames <- colnames(MFI_Matrix) -ColumnNames -``` - -Something interesting occurred when this occurred, we can see in addition to the detector names directly above each a "$P#N" pattern appear, with # standing for increasing numbers. If we recall, we saw something similar in the first output column when we first ran `read.FCS()`. - -![](images/00_flowFrame.png) - -Lets break out the `str()` and `class()` functions from last week and see what we can find out about why this is occuring. - -```{r} -str(ColumnNames) -``` - -In this case we can see that we don't just have a vector (list) similar to what we saw with Fluorophores object last week, because instead of a chr [1:61] we get back a Named chr [1:61] designation. What we see is that in this case, each value has a corresponding index name as well. (ex. $P1N, $P2N, etc.) Let's double check with `class()` function. - -```{r} -class(ColumnNames) -``` - -We can see that everything is character, but it doesn't inform us that each index was named. This is one of the reasons it is best when trying to see what type of an object something is, to use multiple functions, to avoid missing some important details. - -If we were trying to remove the names, being left with just the values (similar to what we saw with the vector-style list last week), we could use the `unname()` function: - -```{r} -unname(ColumnNames) -``` - -
- ---- - -Let's return to the right sidebar to continue our exploration, by clicking on the dropdown arrow for exprs in the side-bar - -![](images/07_ExprsExpanded.png) - -The output is less user-friendly than what we saw when clicking on the little grid. If we scroll down far enough, we get down as far as [,61], which corresponds to the total number of columns. - -![](images/08_LessFriendly.png) - -In base R, column order can be defined by placing the corresponding column index number after a comma ",". So for this case, the first column would be designated would be [,1] while the last column would be designated [,61]. - -```{r} -MFI_Matrix[,1] -``` - -```{r} -MFI_Matrix[,61] -``` - -What would happen if used a column index number that didn't exist? Let's check. - -```{r} -#| error: TRUE - -MFI_Matrix[,350] -``` - -We get back an error message telling us the subscript is out of bounds. - -So if columns are specified by a number after the comma (ex. [,1]), how are rows specified? In R, rows would be specified by a number before the comma [1,] - -```{r} -MFI_Matrix[1,] -``` - -And while not the focus of today, we could retrieve individual values from a matrix by specifying both a row and a column index number. So for example, if we wanted the MFI value for the UV1-A detector for the first acquired cell (knowing that UV1-A is the 2nd column): - -```{r} -MFI_Matrix[1,2] -``` - -From our exploration, this looks to be all the information contained within the "exprs" slot, so let's back up and check on the next slot. - -
- ---- - -### parameters - -As we look at the next slot in the flowFrame object, we can see that parameters looks like it is going to be another more complex object, as it is showing up as an AnnotatedDataFrame object (defined by the Biobase R package, and itself contains 4 slots). - -![](images/09_Parameters.png) - ---- - -Having carved our way this far into the heart of an .fcs file, we are not about to call it quits now, so [CHARGE](https://youtu.be/92gP2J0CUjc?t=72) my fellow cytometrist!!! Click that drop-down arrow! - ---- - -Having survived our charge into the unknown, the four parameter slots appear to be "varMetadata", "data", "dimLabels" and "._classVersion_". - -![](images/10_ParameterSlots.png) - -#### varMetadata - -Fortunately for us, both "varMetadata" and "data" at least appear to be table-like objects of a type known as a "data.frame", so lets click on the grid to open in our editor window. - -In the case of varMetadata, we seem to have retrieved a column of metadata names. - -![](images/11_varMetadata.png) - -These look reminiscent of what we saw at the top of the `read.FCS()` column outputs previously - -![](images/12_varMetadata2.png) - -#### data - -Clicking on the grid for parameters's data slot will end opening the actual content that was displayed. - -![](images/13_data.png) - -Let's try to retrieve the data contained within this slot and save it as it's own variable/object within our R session. First, we need to open flowFrame object, then use @ to get inside its parameters slot. Since parameters is also a complex object (AnnotatedDataFrame specifically), we will need to use another @ to get inside its data slot: - -```{r} -ParameterData <- flowFrame@parameters@data - -head(ParameterData, 10) -``` - -And similarly, we could access with the Bioconductor helper function `parameters()`, but we would need to specify the accessor for data outside the parenthesis. - -```{r} -ParameterData_Alternate <- parameters(flowFrame)@data -``` - -If we ran the `str()` function, we get the following insight into ParameterData's object type - -```{r} -str(ParameterData) -``` - -We can see this class of object is a "data.frame". This is one of the more common object types in R, and we will be seeing these extensively throughout the course. We see that each of the columns appears to be designated by a $ followed by the column name, and then type of column (numeric, character, etc). - -![](images/15_dataframe.png) - -If we are trying to see these columns in R, we notice that data.frame is not like the previous S4 class objets we interacted with, as the @ symbol after doesn't bring up any suggestions - -```{r} -#| eval: FALSE - -ParameterData@ -``` - -By contrast, adding the $ we saw when using the `str()` function does retrieve the underlying information - -```{r} -#| eval: FALSE -ParameterData$ -``` - -![](images/15_Suggestions.png) - -As you become more familiar with R, remembering to check what kind of object you are working with, and how to access the contents will with practice become more familiar to you. - -Similar to what we saw with a matrix, we can subset a data.frame based on the column or row index using square brackets []. - -```{r} -ParameterData[,1] -``` - -The individual detectors or fluorophore appear under "name". For now, based on what we know, the $P# appears to be some sort of name being used as an internal consistent reference to the respective. - -"desc" is appearing empty for this raw spectral fcs file, but if you were to checked an unmixed file, this would be occupied the marker/ligand name assigned to it during the experiment setup. - -"range", "minRange" and "maxRange" are beyond the scope of today, but are used by both instrument manufacturers and software vendors when setting appropiate scaling for a plot. For the actual details, see the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation. - -Having exhausted our options under parameters "varMetadata" and "data" slots, let's continue to the next slot. - -#### dimLabels - -![](images/16_DimLabels.png) - -In this case, not much is returned. Yey! - -```{r} -flowFrame@parameters@dimLabels -``` - -#### classVersion - -Continuing on to the last slot ".__classVersion__" - -```{r} -flowFrame@parameters@.__classVersion__ -``` - -Also mercifully short, both of these seem to be more involved in defining the S4 class object, and don't contain anything we need to retrieve today. - -
- -### Description - -At this point, we have explored both "exprs" and "parameter" slots for the flowFrame object we created. Let's tackle the final slot, named description. - -![](images/17_Description.png) - -When doing so, a very large list is opened within the Positron variables window. While we could scroll through it, it might be easier to retrieve certain number of rows via the console to make interpreting this more structured. - -![](images/18_List.png) - -To retrieve the list itself, we would need to access the description slot of the flowFrame object. Since it is a slot, we will need to use the @ accessor. - - - -```{r} -DescriptionList <- flowFrame@description -``` - -```{r} -#| class-output: "scroll-output" -DescriptionList -``` - -The returned list is a little too large to reasonably explore. We can attempt to subset using the `head()` function as shown below - -```{r} -head(DescriptionList, 5) -``` - -Alternatively, it might be better to subset based on position index - -```{r} -DescriptionList[1:10] -``` - -And just as we saw for exprs and parameters, there is also a Bioconductor helper `keyword()` function to access this same information directly from the flowFrame. - -```{r} -DescriptionList_Alternate <- keyword(flowFrame) -``` - -If we run the `class()` function, we can see that DescriptionList is an actual "list". - -```{r} -class(DescriptionList) -``` - -This is in contrast to the vectors we have previously generated. While these are also list like, they are what are known as as atomic list, which contain values that are all either characters, numerics or logicals. - -```{r} -Fluorophores <- c("BV421", "FITC", "PE", "APC") -class(Fluorophores) -``` - -```{r} -PanelAntibodyCounts <- c(5, 12, 19, 26, 34, 46, 51) -class(PanelAntibodyCounts) -``` - -```{r} -SpecimenIndexToKeep <- c(TRUE, TRUE, FALSE, TRUE) -class(SpecimenIndexToKeep) -``` - -A list on the other hand is not restricted to contain objects composed entirely of a certain atomic type. For example, I could include the three previous vectors into a list using the `list()` function. - -```{r} -MyListofVectors <- list(Fluorophores, PanelAntibodyCounts, SpecimenIndexToKeep) -str(MyListofVectors) -``` - -We can see that with the Description/Keyword list we retrieved from our flowFrame shares a somewhat similar format. - -```{r} -str(DescriptionList[1:10]) -``` - -But in this case, there are also names present ($BEGINANALYSIS, $BEGINDATA, etc). What if we had tried to provide names to our List of Vectors? Would the format match? - -When we assigned a name to each of the vectors (by providing an equal to = ), we get the same kind of structure format to what we see in Description. - -```{r} -MyNamedListofVectors <- list(FluorophoresNamed=Fluorophores, - PanelAntibodyCountsNamed=PanelAntibodyCounts, - SpecimenIndexToKeepNamed=SpecimenIndexToKeep) - -str(MyNamedListofVectors) -``` - -We could then subsequently be able to isolate items from that list using the $ operator. - -```{r} -#| eval: FALSE -MyNamedListofVectors$ -``` - -![](images/20_ListAccess.png) - -Alternatively, we could also access by list index position - -```{r} -MyNamedListofVectors[1] -``` - -Remembering back to the original output from `read.FCS()` we remember that it mentioned 599 keywords being in the description slot, so now we know that this is what was being referenced. - -![](images/00_flowFrame.png) - -# Keyword Madness - -Rather than go through the keywords individually (in which case we would be here through tomorrow), let's take a birds eye view of the contents of this list. - -```{r} -#| class-output: "scroll-output" -Subset <- DescriptionList[1:18] -Subset -``` - -## Early Metadata - -Within the initial portion, we are getting back metadata keywords related to where and how the particular file was acquired. Keywords of potential interest include: - -:::{.callout-tip title="Start Time"} -What time was the .fcs file acquired -::: - -::: {.fragment} - -```{r} -DescriptionList$`$BTIM` -``` -::: - - -:::{.callout-tip title="Cytometer"} -What type of cytometer was the .fcs file acquired on -::: - -::: {.fragment} - -```{r} -DescriptionList$`$CYT` -``` - -::: - -
- ---- - - -:::{.callout-tip title="Cytometer Serial Number"} -Manufacturer Serial Number of the Cytometer -::: - -::: {.fragment} -```{r} -DescriptionList$`$CYTSN` -``` - -::: - - -:::{.callout-tip title="FCS File Acquisition Date"} -What was the date of acquisition -::: - -::: {.fragment} -```{r} -DescriptionList$`$DATE` -``` - -::: - - -
- ---- - - -:::{.callout-tip title="Acquisition End Time"} -What time was acquisition stopped -::: - -::: {.fragment} - -```{r} -DescriptionList$`$ETIM` -``` - -::: - - -:::{.callout-tip title="File Name"} -Name of the .fcs file -::: - -::: {.fragment} - -```{r} -DescriptionList$`$FIL` -``` - -::: - -
- ---- - -:::{.callout-tip title="Operator"} -Who acquired the .fcs file -::: - -::: {.fragment} - -```{r} -DescriptionList$`$OP` -``` - -::: - -
- ---- - -## Detector Values - -The next major stretch of keywords encode parameter values associated with the individual detectors for at the time of acquisition. - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[20:384] -Detectors -``` - -Fortunately for all involved, there is a consistently repeating pattern for the keywords corresponding to each detector. We can see that here for $P7B, $P7E, $P7N, $P7R, $P7TYPE, $P7V - -![](images/21_DetectorIteration.png) - -When referencing to the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation, here are what the particular keyword letters mean: - -:::{.callout-tip title="B"} -Number of bits reserved for parameter number n -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7B` -``` - -::: - -:::{.callout-tip title="E"} -Amplification type for parameter n. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7E` -``` - -::: - -
- ---- - -:::{.callout-tip title="N"} -Short Name for parameter n. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7N` -``` - -::: - -:::{.callout-tip title="R"} -Range for parameter number n. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7R` -``` - -::: - -
- ---- - -:::{.callout-tip title="TYPE"} -Detector type for parameter n. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7TYPE` -``` - -::: - -:::{.callout-tip title="V"} -Detector voltage for parameter n. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7V` -``` - -::: - -
- ---- - -While not immediately obvious, understanding what these keywords encoded has proven useful for our core. In our case, we have built an automated [InstrumentQC dashboard](https://umgccfcss.github.io/InstrumentQC/Aurora3L.html) for all the instruments at our core. - -![](images/InstrumentQC.png) - -
- ---- - -By extracting out from our daily QC bead .fcs files the stored **N (Detector Name)** and **V (Gain/Voltage)** values for all the individual detectors, it allows us to plot Levey-Jennings Plots for our individual instruments, giving us usually around a months warning before an individual laser begins to fail. This helps with scheduling the Field-Service Engineer visit before it starts impacting the actual data. - -![](images/LeveyJennings.png) - -
- ---- - -While most of the detectors keywords are similar (only changing there individual name and voltage) there are a couple exceptions. - -For the FSC/SSC parameters, instead of Raw_Fluorescence value for Type, we see the corresponding Scatter value get return. This in term is what is used by various commercial softwares to show those axis as linear instead of biexponential when selected. - -![](images/22_FSC.png) - -
- ---- - -This is similarly the case for the Time parameter, where in addition to Type being set to Time, the range also appears different to Raw/Scatters value. - -![](images/23_Time.png) - - -## Middle Metadata - -Once we are out of the detector keywords, we find the last of the $Metadata associated keywords. - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[385:398] -Detectors -``` - -Among those of potential interest - -:::{.callout-tip title="Proj"} -Often corresponding to the experiment file name -::: - -::: {.fragment} - -```{r} -DescriptionList$`$PROJ` -``` - -::: - -:::{.callout-tip title="Spillover"} -Where the internal spillover matrix is stored (we will revisit during compensation) -::: - -::: {.fragment} - -```{r} -DescriptionList$`$SPILLOVER` -``` - -::: - - -:::{.callout-tip title="TOT"} -Total events (in this case my downsampled 100 cells) -::: - -::: {.fragment} - -```{r} -DescriptionList$`$TOT` -``` - -::: - -:::{.callout-tip title="Volume"} -Volume amount acquired during acquisition. -::: - -::: {.fragment} - -```{r} -DescriptionList$`$VOL` -``` - -::: - -:::{.callout-tip title="Software"} -Software used and version -::: - -::: {.fragment} - -```{r} -DescriptionList$CREATOR -``` - -::: - -You will notice at this point, the keyword names including a "$" symbol have stopped, so tick marks are no longer required (except when there is a space in the name). The only $ remaining is being used as a selector for a particular item in the list. - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[390:398] -Detectors -``` - - -:::{.callout-tip title="FILENAME"} -Basically the full file.path to the .fcs file of interest. -::: - -::: {.fragment} - -```{r} -DescriptionList$FILENAME -``` - -::: - - -:::{.callout-tip title="GROUPNAME"} -The Name assigned to the acquisition Group. -::: - -::: {.fragment} - -```{r} -DescriptionList$GROUPNAME -``` - -::: - -## Laser Metadata - -Next up, there is a small stretch of keywords containing the values associated with the individual lasers as far as delays and area scaling factors for a particular day (also useful when [plotted](https://umgccfcss.github.io/InstrumentQC/Aurora5L.html)). - - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[399:410] -Detectors -``` - - -## Display - -Then there is a stretch matching whether a particular detector needs to be displayed as linear (in the case of time and scatter) or as log (for individual detectors). - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[412:472] -Detectors -``` - -And a few final keywords with threshold, window scaling and other user selected settings. - -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[473:476] -Detectors -``` - -## flowCore Parameters - -Depending on the arguments selected during `read.FCS()`, we might also encounter additional keywords that are added in by flowCore. For example, we do not see these keywords when "transformation" is set to FALSE. - -```{r} -flowCoreCheck <- read.FCS(filename=firstfile, - transformation = FALSE, truncate_max_range = FALSE) - -flowCoreCheck -``` - -```{r} -#| class-output: "scroll-output" -NoChange <- keyword(flowCoreCheck) -Detectors <- NoChange [476:500] -Detectors -``` - -By contrast, if we had set "transformation" to TRUE: - -```{r} -flowCoreCheck <- read.FCS(filename=firstfile, - transformation = TRUE, truncate_max_range = FALSE) - -flowCoreCheck -``` - -```{r} -#| class-output: "scroll-output" -YesChange <- keyword(flowCoreCheck) -Detectors <- YesChange [476:500] -Detectors -``` - -
- ---- - -For some flow cytometry R packages, you will notice when opening their exported .fcs outputs in commercial software that these flowCore keywords have ended up integrated. It is likely somewhere in the package code the author forgot to add set transformation to FALSE, which is why we are seeing these flowCore keywords after the fact. - -# Take Away - -Today we broke open an .fcs file and explored how the underlying data is organized and stored once it is brought into R. In the process, we continued to build familiarity with some of the basic R knowledge, going from smaller simpler objects we encountered in week 2 to matrices and data.frames, to complex objects with multiple slots typical of what we encounter in the Bioconductor packages. We will build on these initial observations on the weeks to come. - -In context of our continuing analogy, with each function being a tool, and an R package a toolbox, each tool in the toolbox works on different types of objects. A hammer needs nails, screwdrivers need screws, a paintbrush needs paint and a wall, etc. Object types help define these requirements, so when we use a function, knowing what type can help determine what we provide to it in order for it to work properly and not error out. - -Next week, we will dive into the world of [tidyverse](https://tidyverse.org/), working specifically with these intermediate object types matrices and data.frames. The basic premise is to think of all data as rows and columns, the reasoning behind this approach which can be found [here](https://vita.had.co.nz/papers/tidy-data.html). - -![](images/TakeAway.jpg) - -
- ---- - -# Additional Resources - -[Data File Standard for Flow Cytometry, Version FCS 3.1](https://pmc.ncbi.nlm.nih.gov/articles/PMC2892967/) - -[R Programming - R Data Types: Vectors and Lists](https://youtu.be/p01ckVx-678?si=BQp6SFTWfZzz2-wI) - -[Base Types vs. Object-Oriented Objects](https://adv-r.hadley.nz/base-types.html) - -
- ---- - -# Take-home Problems - -:::{.callout-tip title="Problem 1"} -Today's walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26...). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc. -::: - -:::{.callout-tip title="Problem 2"} -Today's files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22...). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc) -::: - -:::{.callout-tip title="Problem 3"} -If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using [Floreada.io](/course/00_Floreada/index.qmd). -::: - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "03 - Inside an FCS File" +author: "David Rach" +date: 02-15-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream recording, see [here](https://youtu.be/1wZ61x0i19o?t=278) + + + +For screen-shot slides, click [here](/course/03_InsideFCSFile/slides.qmd) + +
+ +--- + +# Background + +Welcome to the Week #3! Having subjected everyone to two R-focused weeks, this week will have more of a cytometry-focus as we slice into an .fcs file. We will hopefully gather greater understanding of how an .fcs file is structured and what additional kinds of information we can retrieve (while becoming increasingly puzzled why different manufacturers insist on using different keyword names for the exact same things). + +We will also gain additional exposure to more object types in R (vectors, list, matrices and data.frames). Continuing the analogy from last week, if every function is the equivalent of a tool in a toolbox, each tool requires certain types of things to do its job properly (hammer ~ nail, screwdriver ~ screws, paintbrush ~ paint, etc.). Being able to identify what type/kind of object a particular variable we have created in R is will allow us to pass it to the correct function that will allow us to work with that object type. + +
+ +--- + +:::{.callout-important title="Housekeeping"} +We are building off concepts that were covered in [Week #1 (Installing R packages)](/course/01_InstallingRPackages/index.qmd) and especially [Week #2 (File Paths)](/course/02_FilePaths/index.qmd). +For those who are flow cytometry beginners, please see [UChicago Flow](https://youtu.be/gC4brjHbLkk?si=li98x7KlLXUFWGX3) Flow Basics Series for additional context. +::: + + +:::{.callout-tip title="Today's Goal"} +If you find yourself at some point going "I have no idea what is going on", please pause, take a break, and circle back later in the day. Our goal is not to have you memorize how to quickly access 100 archaic keywords, but rather showcase a typical object exploration workflow. So don't power through, but rather circle back when you are in an exploring mindset. Consider what kind of information from within an .fcs file you'd like to retrieve, and then explore/navigate your way through the various paths until you find the information that you were looking for. +::: + +--- + +:::{.callout-important title="Housekeeping"} +As we do [every week](/course/02_FilePaths/index.qmd#new-repository), on GitHub, sync your forked-version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. From there, copy the data folder to a separate project folder you have created. This will prevent any merge issues bringing in new data next week. +::: + +--- + +# Walk Through + +--- + +## Getting Set Up + +--- + +### Set up File Paths + +Having copied over the new data to your working project folder (Week 3 or whatever your chosen name), let's identify the file paths between our working directory and the fcs files. If you retained the same project organization structure we had during Week #2, it may look similar to the following: + +```{r} +#| eval: FALSE +#| include: FALSE + +# Please note, this code-chunk is only for use when writing the code. Please switch eval to false and next code blocks eval to true before rendering + +PathToDataFolder <- file.path(getwd(), "course", "03_InsideFCSFile", "data") +``` + +```{r} +#| eval: TRUE +PathToDataFolder <- file.path("data") +``` + +```{r} +PathToDataFolder +``` + +
+ +--- + +### Locate .fcs files + +We will now locate our .fcs files. As we saw last week, our computer will need the full file.paths to these individual files, so we will set the `list.files()` "full.names" argument to TRUE. + +```{r} +#| eval: TRUE +fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) +fcs_files +``` + +By contrast, if the "full.names" argument was set to FALSE, we would have retrieved just the file names + +```{r} +list.files(PathToDataFolder, pattern=".fcs", full.names=FALSE) +``` + +This would have been the equivalent of running the `basename` function on the "full.names=TRUE" output. +```{r} +basename(fcs_files) +``` + +
+ +--- + +## flowCore + +We will be using the `flowCore` package, which is the oldest and most-frequently downloaded flow cytometry package on [Bioconductor](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry). + +```{r} +#| code-fold: TRUE +#| warning: FALSE +#| message: FALSE + +# I have attached this code for anyone that is interested in seeing how these plots were made. The content is not part of today's lesson, so if you are just starting off, we will cover the details of data-tidying and creating ggplot objects over the next several weeks. Best, David + +# Load required packages via a library call + +library(dplyr) # CRAN +library(stringr) # CRAN +library(ggplot2) # CRAN +#library(plotly) # Using the :: to access + +# Loading in the dataset contained within the .csv file +BioconductorFlow_path <- file.path(PathToDataFolder, "BioconductorFlow.csv") +BioconductorFlowPackages <- read.csv(BioconductorFlow_path, check.names=FALSE) +BioconductorFlowPackages <- BioconductorFlowPackages |> + arrange(desc(since)) |> mutate(package = factor(package, levels = package)) + +# Newer Base R Pipe : |> +# Older mostly equivalent Magrittr Pipe %>% +``` + +```{r} +#| code-fold: true +#| fig-height: 9 + +# Notice the code-chunk eval arguments above dictate the shape of the final rendered plot. + +# Taking the imported dataset and passing it to ggplot2 to create the first plot. + +plot <- ggplot(BioconductorFlowPackages, + aes(x = 0, xend = since, y = package, yend = package)) + + geom_segment(linewidth = 2, color = "steelblue") + + scale_x_continuous(trans = "reverse", + breaks = seq(0, max(BioconductorFlowPackages$since), by = 5)) + + labs( + x = "Years in Bioconductor", + y = NULL, + title = "Bioconductor Flow Cytometry R packages" + ) + + theme_bw() + +# Taking the static plot and making it interactive using the plotly package + +plotly::ggplotly(plot) +``` + +```{r} +#| code-fold: TRUE + +# Retrieving the names of Bioconductor flow cytometry R packages in correct release order. + +HistoricalOrder <- BioconductorFlowPackages |> pull(package) + +# Bringing in 2025 package usage dataset from a .csv file +BioconductorUsage_path <- file.path(PathToDataFolder, "BioconductorDownloads.csv") +BioconductorUsage <- read.csv(BioconductorUsage_path, check.names=FALSE) +BioconductorUsage <- BioconductorUsage |> dplyr::filter(Month %in% "all") + +# Note, dplyr::filter is used due to flowCore also having a filter function, which causes conflicts once it is attached to the local environment. + +# Combining both data.frames for use in the plot + +Dataset <- left_join(BioconductorFlowPackages, BioconductorUsage, by="package") + +# Rearranging the order in which packages are displayed + +Dataset$package <- factor(Dataset$package, levels=HistoricalOrder) +``` + +```{r} +#| code-fold: TRUE + +# Generating the 2nd plot with ggplot2 + +plot <- ggplot(Dataset, aes(x = since, y = Nb_of_distinct_IPs)) + + geom_point(aes(color = package), size = 3, alpha = 0.7) + + labs( + x = "Years in Bioconductor", + y = "Number of Yearly Downloads", + title = "", + color = "Package" + ) + + theme_bw() + +# Making it interactive with plotly + +plotly::ggplotly(plot) +``` + +flowCore is also one of the many Bioconductor packages maintained by [Mike Jiang](https://github.com/mikejiang). In many ways (as those who completed the optional take-home problems for Week #1 know) reminiscent of this [xkcd](https://xkcd.com/2347/) comic: + +![](images/BioconductorXKCD.png) + +As with all our R packages, we first need to make sure `flowCore` is attached to our local environment via the library call. + +```{r} +library(flowCore) +``` + +The function we will be using today is the `read.FCS()` function. Do you remember how to access the help documentation? + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Or when in Positron, hovering over the highlighted function name within the code-chunk + +?flowCore::read.FCS +``` + +To start, lets select just the first .fcs file. We will do this by indexing the first item within fcs_files via the square brackets []. + +```{r} +firstfile <- fcs_files[1] +firstfile +``` + +## flowFrame + +For `read.FCS()`, it accepts several arguments. The argument "filename" is where we provide our file.path to .fcs file that we wish to load into R. Let's go ahead and do so + +```{r} +#| eval: FALSE + +read.FCS(filename=firstfile) + +``` + +Please note, if you are doing this with your own .fcs files, you will need to provide two additional arguments, "transformation" = FALSE, and "truncate_max_range" = FALSE for the files to be read in correctly. We will revisit the reasons why in Week #5. + +```{r} +read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) +``` + +In this case, we can see the .fcs file has been read into R as a "flowFrame" object. We can also see the file name, as well as details about the number of cells, and number of columns (whether detectors (for raw spectral flow data) or fluorophores (for unmixed spectral flow data)). + +![](images/00_flowFrame.png) + +Directly below we see what resembles a table. At first glance, the only column with an immediately discernable purpose is the one with the name column, which is listing the detectors present on a [Cytek Aurora](https://bpb-us-w2.wpmucdn.com/voices.uchicago.edu/dist/2/1824/files/2021/10/Aurora-Configuration.png). + +![](images/01_flowFrameDetectors.png) + +And finally, at the bottom we reach a line that tells us that for this .fcs files, 599 keyword can be found in a description slot. + +![](images/02_KeywordsFiveNineNine.png) + +
+ +--- + +So let's get our bearings, we have loaded in an .fcs file to R, but let's use some of the concepts we covered last week to try to understand a bit about what type or class of object we are working with. From the output, we saw the words flowFrame object, so let's read it back in again, but assign it to an variable/object called flowFrame so that we can use the type-discerning functions we worked with last week on. + +```{r} +flowFrame <- read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) +``` + +As we create this variable, if we have the session tab selected on our right secondary side bar, we see it appear: + +![](images/03_SessionTab.png) + +If we were to use the type-determining functions we learned last week + +```{r} +#| eval: FALSE +#| include: FALSE +# This is the whole ball game +str(flowFrame) +``` + +```{r} +class(flowFrame) +``` + +flowFrames are a class of object with a structure defined within the `flowCore` package. They are used to work with the data contained within individual .fcs files. Looking again at the right secondary side bar, we can see that it shows up as a ""S4 class flowFrame package flowCore""" with 3 slots, with the words flowFrame adjacent to it. + +A perfectly valid first reaction to first reading this is "well how should I know what any of this means?". Powering through this initial discomfort, let's go ahead and click on the dropdown arrow next to the variables name and see if we get any additional clarity on the issue. + +![](images/04_Slots.png) + +When we do so, three additional drop-downs appear. Based on the previous line that mentioned 3 slots, we could infer that each line corresponds to one of those slots. + +What we are encountering with flowFrame is our first example of an S4 object type. These more-complicated object types are quite common for the various [Bioconductor](https://adv-r.hadley.nz/s4.html) affilitated R packages. + +These objects will usually appear with either S4 or S3 in their metadata, and are made up of various simpler object types that are cobbled together within the larger object, usually occupying individual slots. + +What advantage this bundling provides will be something we revisit throughout the course as you encounter more of these S4/S3 objects. + +
+ +--- + +### exprs + +The first slot within the flowFrame object shows up with the name "exprs". For the exprs object, glancing at it's middle column, we can based on the 100 rows and 61 columns, that it is likely a matrix-style object. We might also recall we saw similar numbers in the printed output when we ran `read.FCS()`earlier. + +![](images/00_flowFrame.png) + +Which likely means that "exprs" slot is where the MFI data for the individual acquired cells within our .fcs file is being stored. Within Positron, for a matrix object, we can click on the little grid symbol on the far right to open up the table within editor. + +![](images/05_OpenTable.png) + +If we utilize the scroll bars, we can see that the individual detectors (in the case of uploading a raw spectral fcs file, they would appear as fluorophores for unmixed spectral or conventional fcs files) occupy the individual columns, which are named. The rows are not named, but number 100, matching the number of cells present in the .fcs file. Additionally, on the far left there is a little summary table about the overall data. + +![](images/06_TableInEditor.png) + +Let's go ahead and assign this matrix to a new variable/object so that we can explore it later. Since flowFrame is an S4 object, it's slots can be individually accessed by adding the @ symbol and the respective slot name. + +```{r} +MFI_Matrix <- flowFrame@exprs +``` + +Alternatively, we can use the Bioconductor helper function `exprs()` to get data held in that slot + +```{r} +MFI_Matrix_Alternate <- exprs(flowFrame) +``` + +In the case of the above, this displayed text output to the console would be unwiedly to display all at once. If we wanted to only see the first five rows, we could use the `head()` function, and provide a value of 5. + +```{r} +head(MFI_Matrix, 5) +``` + +This is much more workable, especially on a small laptop screen. We can see that there are names for each column corresponding to detector/fluorophore/metal depending on the .fcs file we are accessing. Lets retrieve these column names using the `colnames()` function. + +```{r} +ColumnNames <- colnames(MFI_Matrix) +ColumnNames +``` + +Something interesting occurred when this occurred, we can see in addition to the detector names directly above each a "$P#N" pattern appear, with # standing for increasing numbers. If we recall, we saw something similar in the first output column when we first ran `read.FCS()`. + +![](images/00_flowFrame.png) + +Lets break out the `str()` and `class()` functions from last week and see what we can find out about why this is occuring. + +```{r} +str(ColumnNames) +``` + +In this case we can see that we don't just have a vector (list) similar to what we saw with Fluorophores object last week, because instead of a chr [1:61] we get back a Named chr [1:61] designation. What we see is that in this case, each value has a corresponding index name as well. (ex. $P1N, $P2N, etc.) Let's double check with `class()` function. + +```{r} +class(ColumnNames) +``` + +We can see that everything is character, but it doesn't inform us that each index was named. This is one of the reasons it is best when trying to see what type of an object something is, to use multiple functions, to avoid missing some important details. + +If we were trying to remove the names, being left with just the values (similar to what we saw with the vector-style list last week), we could use the `unname()` function: + +```{r} +unname(ColumnNames) +``` + +
+ +--- + +Let's return to the right sidebar to continue our exploration, by clicking on the dropdown arrow for exprs in the side-bar + +![](images/07_ExprsExpanded.png) + +The output is less user-friendly than what we saw when clicking on the little grid. If we scroll down far enough, we get down as far as [,61], which corresponds to the total number of columns. + +![](images/08_LessFriendly.png) + +In base R, column order can be defined by placing the corresponding column index number after a comma ",". So for this case, the first column would be designated would be [,1] while the last column would be designated [,61]. + +```{r} +MFI_Matrix[,1] +``` + +```{r} +MFI_Matrix[,61] +``` + +What would happen if used a column index number that didn't exist? Let's check. + +```{r} +#| error: TRUE + +MFI_Matrix[,350] +``` + +We get back an error message telling us the subscript is out of bounds. + +So if columns are specified by a number after the comma (ex. [,1]), how are rows specified? In R, rows would be specified by a number before the comma [1,] + +```{r} +MFI_Matrix[1,] +``` + +And while not the focus of today, we could retrieve individual values from a matrix by specifying both a row and a column index number. So for example, if we wanted the MFI value for the UV1-A detector for the first acquired cell (knowing that UV1-A is the 2nd column): + +```{r} +MFI_Matrix[1,2] +``` + +From our exploration, this looks to be all the information contained within the "exprs" slot, so let's back up and check on the next slot. + +
+ +--- + +### parameters + +As we look at the next slot in the flowFrame object, we can see that parameters looks like it is going to be another more complex object, as it is showing up as an AnnotatedDataFrame object (defined by the Biobase R package, and itself contains 4 slots). + +![](images/09_Parameters.png) + +--- + +Having carved our way this far into the heart of an .fcs file, we are not about to call it quits now, so [CHARGE](https://youtu.be/92gP2J0CUjc?t=72) my fellow cytometrist!!! Click that drop-down arrow! + +--- + +Having survived our charge into the unknown, the four parameter slots appear to be "varMetadata", "data", "dimLabels" and "._classVersion_". + +![](images/10_ParameterSlots.png) + +#### varMetadata + +Fortunately for us, both "varMetadata" and "data" at least appear to be table-like objects of a type known as a "data.frame", so lets click on the grid to open in our editor window. + +In the case of varMetadata, we seem to have retrieved a column of metadata names. + +![](images/11_varMetadata.png) + +These look reminiscent of what we saw at the top of the `read.FCS()` column outputs previously + +![](images/12_varMetadata2.png) + +#### data + +Clicking on the grid for parameters's data slot will end opening the actual content that was displayed. + +![](images/13_data.png) + +Let's try to retrieve the data contained within this slot and save it as it's own variable/object within our R session. First, we need to open flowFrame object, then use @ to get inside its parameters slot. Since parameters is also a complex object (AnnotatedDataFrame specifically), we will need to use another @ to get inside its data slot: + +```{r} +ParameterData <- flowFrame@parameters@data + +head(ParameterData, 10) +``` + +And similarly, we could access with the Bioconductor helper function `parameters()`, but we would need to specify the accessor for data outside the parenthesis. + +```{r} +ParameterData_Alternate <- parameters(flowFrame)@data +``` + +If we ran the `str()` function, we get the following insight into ParameterData's object type + +```{r} +str(ParameterData) +``` + +We can see this class of object is a "data.frame". This is one of the more common object types in R, and we will be seeing these extensively throughout the course. We see that each of the columns appears to be designated by a $ followed by the column name, and then type of column (numeric, character, etc). + +![](images/15_dataframe.png) + +If we are trying to see these columns in R, we notice that data.frame is not like the previous S4 class objets we interacted with, as the @ symbol after doesn't bring up any suggestions + +```{r} +#| eval: FALSE + +ParameterData@ +``` + +By contrast, adding the $ we saw when using the `str()` function does retrieve the underlying information + +```{r} +#| eval: FALSE +ParameterData$ +``` + +![](images/15_Suggestions.png) + +As you become more familiar with R, remembering to check what kind of object you are working with, and how to access the contents will with practice become more familiar to you. + +Similar to what we saw with a matrix, we can subset a data.frame based on the column or row index using square brackets []. + +```{r} +ParameterData[,1] +``` + +The individual detectors or fluorophore appear under "name". For now, based on what we know, the $P# appears to be some sort of name being used as an internal consistent reference to the respective. + +"desc" is appearing empty for this raw spectral fcs file, but if you were to checked an unmixed file, this would be occupied the marker/ligand name assigned to it during the experiment setup. + +"range", "minRange" and "maxRange" are beyond the scope of today, but are used by both instrument manufacturers and software vendors when setting appropiate scaling for a plot. For the actual details, see the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation. + +Having exhausted our options under parameters "varMetadata" and "data" slots, let's continue to the next slot. + +#### dimLabels + +![](images/16_DimLabels.png) + +In this case, not much is returned. Yey! + +```{r} +flowFrame@parameters@dimLabels +``` + +#### classVersion + +Continuing on to the last slot ".__classVersion__" + +```{r} +flowFrame@parameters@.__classVersion__ +``` + +Also mercifully short, both of these seem to be more involved in defining the S4 class object, and don't contain anything we need to retrieve today. + +
+ +### Description + +At this point, we have explored both "exprs" and "parameter" slots for the flowFrame object we created. Let's tackle the final slot, named description. + +![](images/17_Description.png) + +When doing so, a very large list is opened within the Positron variables window. While we could scroll through it, it might be easier to retrieve certain number of rows via the console to make interpreting this more structured. + +![](images/18_List.png) + +To retrieve the list itself, we would need to access the description slot of the flowFrame object. Since it is a slot, we will need to use the @ accessor. + + + +```{r} +DescriptionList <- flowFrame@description +``` + +```{r} +#| class-output: "scroll-output" +DescriptionList +``` + +The returned list is a little too large to reasonably explore. We can attempt to subset using the `head()` function as shown below + +```{r} +head(DescriptionList, 5) +``` + +Alternatively, it might be better to subset based on position index + +```{r} +DescriptionList[1:10] +``` + +And just as we saw for exprs and parameters, there is also a Bioconductor helper `keyword()` function to access this same information directly from the flowFrame. + +```{r} +DescriptionList_Alternate <- keyword(flowFrame) +``` + +If we run the `class()` function, we can see that DescriptionList is an actual "list". + +```{r} +class(DescriptionList) +``` + +This is in contrast to the vectors we have previously generated. While these are also list like, they are what are known as as atomic list, which contain values that are all either characters, numerics or logicals. + +```{r} +Fluorophores <- c("BV421", "FITC", "PE", "APC") +class(Fluorophores) +``` + +```{r} +PanelAntibodyCounts <- c(5, 12, 19, 26, 34, 46, 51) +class(PanelAntibodyCounts) +``` + +```{r} +SpecimenIndexToKeep <- c(TRUE, TRUE, FALSE, TRUE) +class(SpecimenIndexToKeep) +``` + +A list on the other hand is not restricted to contain objects composed entirely of a certain atomic type. For example, I could include the three previous vectors into a list using the `list()` function. + +```{r} +MyListofVectors <- list(Fluorophores, PanelAntibodyCounts, SpecimenIndexToKeep) +str(MyListofVectors) +``` + +We can see that with the Description/Keyword list we retrieved from our flowFrame shares a somewhat similar format. + +```{r} +str(DescriptionList[1:10]) +``` + +But in this case, there are also names present ($BEGINANALYSIS, $BEGINDATA, etc). What if we had tried to provide names to our List of Vectors? Would the format match? + +When we assigned a name to each of the vectors (by providing an equal to = ), we get the same kind of structure format to what we see in Description. + +```{r} +MyNamedListofVectors <- list(FluorophoresNamed=Fluorophores, + PanelAntibodyCountsNamed=PanelAntibodyCounts, + SpecimenIndexToKeepNamed=SpecimenIndexToKeep) + +str(MyNamedListofVectors) +``` + +We could then subsequently be able to isolate items from that list using the $ operator. + +```{r} +#| eval: FALSE +MyNamedListofVectors$ +``` + +![](images/20_ListAccess.png) + +Alternatively, we could also access by list index position + +```{r} +MyNamedListofVectors[1] +``` + +Remembering back to the original output from `read.FCS()` we remember that it mentioned 599 keywords being in the description slot, so now we know that this is what was being referenced. + +![](images/00_flowFrame.png) + +# Keyword Madness + +Rather than go through the keywords individually (in which case we would be here through tomorrow), let's take a birds eye view of the contents of this list. + +```{r} +#| class-output: "scroll-output" +Subset <- DescriptionList[1:18] +Subset +``` + +## Early Metadata + +Within the initial portion, we are getting back metadata keywords related to where and how the particular file was acquired. Keywords of potential interest include: + +:::{.callout-tip title="Start Time"} +What time was the .fcs file acquired +::: + +::: {.fragment} + +```{r} +DescriptionList$`$BTIM` +``` +::: + + +:::{.callout-tip title="Cytometer"} +What type of cytometer was the .fcs file acquired on +::: + +::: {.fragment} + +```{r} +DescriptionList$`$CYT` +``` + +::: + +
+ +--- + + +:::{.callout-tip title="Cytometer Serial Number"} +Manufacturer Serial Number of the Cytometer +::: + +::: {.fragment} +```{r} +DescriptionList$`$CYTSN` +``` + +::: + + +:::{.callout-tip title="FCS File Acquisition Date"} +What was the date of acquisition +::: + +::: {.fragment} +```{r} +DescriptionList$`$DATE` +``` + +::: + + +
+ +--- + + +:::{.callout-tip title="Acquisition End Time"} +What time was acquisition stopped +::: + +::: {.fragment} + +```{r} +DescriptionList$`$ETIM` +``` + +::: + + +:::{.callout-tip title="File Name"} +Name of the .fcs file +::: + +::: {.fragment} + +```{r} +DescriptionList$`$FIL` +``` + +::: + +
+ +--- + +:::{.callout-tip title="Operator"} +Who acquired the .fcs file +::: + +::: {.fragment} + +```{r} +DescriptionList$`$OP` +``` + +::: + +
+ +--- + +## Detector Values + +The next major stretch of keywords encode parameter values associated with the individual detectors for at the time of acquisition. + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[20:384] +Detectors +``` + +Fortunately for all involved, there is a consistently repeating pattern for the keywords corresponding to each detector. We can see that here for $P7B, $P7E, $P7N, $P7R, $P7TYPE, $P7V + +![](images/21_DetectorIteration.png) + +When referencing to the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation, here are what the particular keyword letters mean: + +:::{.callout-tip title="B"} +Number of bits reserved for parameter number n +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7B` +``` + +::: + +:::{.callout-tip title="E"} +Amplification type for parameter n. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7E` +``` + +::: + +
+ +--- + +:::{.callout-tip title="N"} +Short Name for parameter n. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7N` +``` + +::: + +:::{.callout-tip title="R"} +Range for parameter number n. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7R` +``` + +::: + +
+ +--- + +:::{.callout-tip title="TYPE"} +Detector type for parameter n. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7TYPE` +``` + +::: + +:::{.callout-tip title="V"} +Detector voltage for parameter n. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7V` +``` + +::: + +
+ +--- + +While not immediately obvious, understanding what these keywords encoded has proven useful for our core. In our case, we have built an automated [InstrumentQC dashboard](https://umgccfcss.github.io/InstrumentQC/Aurora3L.html) for all the instruments at our core. + +![](images/InstrumentQC.png) + +
+ +--- + +By extracting out from our daily QC bead .fcs files the stored **N (Detector Name)** and **V (Gain/Voltage)** values for all the individual detectors, it allows us to plot Levey-Jennings Plots for our individual instruments, giving us usually around a months warning before an individual laser begins to fail. This helps with scheduling the Field-Service Engineer visit before it starts impacting the actual data. + +![](images/LeveyJennings.png) + +
+ +--- + +While most of the detectors keywords are similar (only changing there individual name and voltage) there are a couple exceptions. + +For the FSC/SSC parameters, instead of Raw_Fluorescence value for Type, we see the corresponding Scatter value get return. This in term is what is used by various commercial softwares to show those axis as linear instead of biexponential when selected. + +![](images/22_FSC.png) + +
+ +--- + +This is similarly the case for the Time parameter, where in addition to Type being set to Time, the range also appears different to Raw/Scatters value. + +![](images/23_Time.png) + + +## Middle Metadata + +Once we are out of the detector keywords, we find the last of the $Metadata associated keywords. + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[385:398] +Detectors +``` + +Among those of potential interest + +:::{.callout-tip title="Proj"} +Often corresponding to the experiment file name +::: + +::: {.fragment} + +```{r} +DescriptionList$`$PROJ` +``` + +::: + +:::{.callout-tip title="Spillover"} +Where the internal spillover matrix is stored (we will revisit during compensation) +::: + +::: {.fragment} + +```{r} +DescriptionList$`$SPILLOVER` +``` + +::: + + +:::{.callout-tip title="TOT"} +Total events (in this case my downsampled 100 cells) +::: + +::: {.fragment} + +```{r} +DescriptionList$`$TOT` +``` + +::: + +:::{.callout-tip title="Volume"} +Volume amount acquired during acquisition. +::: + +::: {.fragment} + +```{r} +DescriptionList$`$VOL` +``` + +::: + +:::{.callout-tip title="Software"} +Software used and version +::: + +::: {.fragment} + +```{r} +DescriptionList$CREATOR +``` + +::: + +You will notice at this point, the keyword names including a "$" symbol have stopped, so tick marks are no longer required (except when there is a space in the name). The only $ remaining is being used as a selector for a particular item in the list. + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[390:398] +Detectors +``` + + +:::{.callout-tip title="FILENAME"} +Basically the full file.path to the .fcs file of interest. +::: + +::: {.fragment} + +```{r} +DescriptionList$FILENAME +``` + +::: + + +:::{.callout-tip title="GROUPNAME"} +The Name assigned to the acquisition Group. +::: + +::: {.fragment} + +```{r} +DescriptionList$GROUPNAME +``` + +::: + +## Laser Metadata + +Next up, there is a small stretch of keywords containing the values associated with the individual lasers as far as delays and area scaling factors for a particular day (also useful when [plotted](https://umgccfcss.github.io/InstrumentQC/Aurora5L.html)). + + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[399:410] +Detectors +``` + + +## Display + +Then there is a stretch matching whether a particular detector needs to be displayed as linear (in the case of time and scatter) or as log (for individual detectors). + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[412:472] +Detectors +``` + +And a few final keywords with threshold, window scaling and other user selected settings. + +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[473:476] +Detectors +``` + +## flowCore Parameters + +Depending on the arguments selected during `read.FCS()`, we might also encounter additional keywords that are added in by flowCore. For example, we do not see these keywords when "transformation" is set to FALSE. + +```{r} +flowCoreCheck <- read.FCS(filename=firstfile, + transformation = FALSE, truncate_max_range = FALSE) + +flowCoreCheck +``` + +```{r} +#| class-output: "scroll-output" +NoChange <- keyword(flowCoreCheck) +Detectors <- NoChange [476:500] +Detectors +``` + +By contrast, if we had set "transformation" to TRUE: + +```{r} +flowCoreCheck <- read.FCS(filename=firstfile, + transformation = TRUE, truncate_max_range = FALSE) + +flowCoreCheck +``` + +```{r} +#| class-output: "scroll-output" +YesChange <- keyword(flowCoreCheck) +Detectors <- YesChange [476:500] +Detectors +``` + +
+ +--- + +For some flow cytometry R packages, you will notice when opening their exported .fcs outputs in commercial software that these flowCore keywords have ended up integrated. It is likely somewhere in the package code the author forgot to add set transformation to FALSE, which is why we are seeing these flowCore keywords after the fact. + +# Take Away + +Today we broke open an .fcs file and explored how the underlying data is organized and stored once it is brought into R. In the process, we continued to build familiarity with some of the basic R knowledge, going from smaller simpler objects we encountered in week 2 to matrices and data.frames, to complex objects with multiple slots typical of what we encounter in the Bioconductor packages. We will build on these initial observations on the weeks to come. + +In context of our continuing analogy, with each function being a tool, and an R package a toolbox, each tool in the toolbox works on different types of objects. A hammer needs nails, screwdrivers need screws, a paintbrush needs paint and a wall, etc. Object types help define these requirements, so when we use a function, knowing what type can help determine what we provide to it in order for it to work properly and not error out. + +Next week, we will dive into the world of [tidyverse](https://tidyverse.org/), working specifically with these intermediate object types matrices and data.frames. The basic premise is to think of all data as rows and columns, the reasoning behind this approach which can be found [here](https://vita.had.co.nz/papers/tidy-data.html). + +![](images/TakeAway.jpg) + +
+ +--- + +# Additional Resources + +[Data File Standard for Flow Cytometry, Version FCS 3.1](https://pmc.ncbi.nlm.nih.gov/articles/PMC2892967/) + +[R Programming - R Data Types: Vectors and Lists](https://youtu.be/p01ckVx-678?si=BQp6SFTWfZzz2-wI) + +[Base Types vs. Object-Oriented Objects](https://adv-r.hadley.nz/base-types.html) + +
+ +--- + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Today's walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26...). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc. +::: + +:::{.callout-tip title="Problem 2"} +Today's files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22...). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc) +::: + +:::{.callout-tip title="Problem 3"} +If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using [Floreada.io](/course/00_Floreada/index.qmd). +::: + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/03_InsideFCSFile/slides.qmd b/course/03_InsideFCSFile/slides.qmd index 45dd6d1..67ece4d 100644 --- a/course/03_InsideFCSFile/slides.qmd +++ b/course/03_InsideFCSFile/slides.qmd @@ -1,1976 +1,1976 @@ ---- -title: "03 - Inside an FCS File" -author: "David Rach" -date: 02-16-2026 -format: - revealjs: - theme: default - slide-number: true - incremental: true -page-layout: full -execute: - echo: true - warning: false - message: false ---- - -![](/images/WebsiteBanner.png) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) -::: - ---- - -# Background - - -::: {.fragment} -::: {.callout-tip title="."} -Welcome to the Week #3! Having subjected everyone to two R-focused weeks, this week will have more of a cytometry-focus as we slice into an .fcs file. - -We will hopefully gather greater understanding of how an .fcs file is structured and what additional kinds of information we can retrieve (while becoming increasingly puzzled why different manufacturers insist on using different keyword names for the exact same things). -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We will also gain additional exposure to more object types in R (vectors, list, matrices and data.frames). - - Continuing the analogy from last week, if every function is the equivalent of a tool in a toolbox, each tool requires certain types of things to do its job properly (hammer ~ nail, screwdriver ~ screws, paintbrush ~ paint, etc.). - - Being able to identify what type/kind of object a particular variable we have created in R is will allow us to pass it to the correct function that will allow us to work with that object type. -::: -::: - ---- - -:::{.callout-important title="Housekeeping"} -We are building off concepts that were covered in [Week #1 (Installing R packages)](/course/01_InstallingRPackages/index.qmd) and especially [Week #2 (File Paths)](/course/02_FilePaths/index.qmd). -For those who are flow cytometry beginners, please see [UChicago Flow](https://youtu.be/gC4brjHbLkk?si=li98x7KlLXUFWGX3) Flow Basics Series for additional context. -::: - - -:::{.callout-tip title="Today's Goal"} -If you find yourself at some point going "I have no idea what is going on", please pause, take a break, and circle back later in the day. Our goal is not to have you memorize how to quickly access 100 archaic keywords, but rather showcase a typical object exploration workflow. - -So don't power through, but rather circle back when you are in an exploring mindset. Consider what kind of information from within an .fcs file you'd like to retrieve, and then explore/navigate your way through the various paths until you find the information that you were looking for. -::: - ---- - -:::{.callout-important title="Housekeeping"} -As we do [every week](/course/02_FilePaths/index.qmd#new-repository), on GitHub, sync your forked-version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. From there, copy the data folder to a separate project folder you have created. This will prevent any merge issues bringing in new data next week. -::: - ---- - -# Walk Through - ---- - -## Getting Set Up - ---- - -### Set up File Paths - -::: {.fragment} -::: {.callout-tip title="."} -Having copied over the new data to your working project folder (Week 3 or whatever your chosen name), let's identify the file paths between our working directory and the fcs files. If you retained the same project organization structure we had during Week #2, it may look similar to the following: -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE -#| include: FALSE - -# Please note, this code-chunk is only for use when writing the code. Please switch eval to false and next code blocks eval to true before rendering - -PathToDataFolder <- file.path(getwd(), "course", "03_InsideFCSFile", "data") -``` - -```{r} -#| eval: TRUE -PathToDataFolder <- file.path("data") -``` - -```{r} -PathToDataFolder -``` - -::: - ---- - -### Locate .fcs files - -::: {.fragment} -::: {.callout-tip title="."} -We will now locate our .fcs files. As we saw last week, our computer will need the full file.paths to these individual files, so we will set the `list.files()` "full.names" argument to TRUE. -::: -::: - -::: {.fragment} -```{r} -#| eval: TRUE -fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) -fcs_files -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, if the "full.names" argument was set to FALSE, we would have retrieved just the file names -::: -::: - -::: {.fragment} -```{r} -list.files(PathToDataFolder, pattern=".fcs", full.names=FALSE) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This would have been the equivalent of running the `basename` function on the "full.names=TRUE" output. -::: -::: - -::: {.fragment} -```{r} -basename(fcs_files) -``` - -::: - - ---- - -## flowCore - -::: {.fragment} -::: {.callout-tip title="."} -We will be using the `flowCore` package, which is the oldest and most-frequently downloaded flow cytometry package on [Bioconductor](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry). -::: -::: - ---- - -::: {.fragment} - -```{r} -#| include: FALSE -#| warning: FALSE -#| message: FALSE - -# I have attached this code for anyone that is interested in seeing how these plots were made. The content is not part of today's lesson, so if you are just starting off, we will cover the details of data-tidying and creating ggplot objects over the next several weeks. Best, David - -# Load required packages via a library call - -library(dplyr) # CRAN -library(stringr) # CRAN -library(ggplot2) # CRAN -#library(plotly) # Using the :: to access - -# Loading in the dataset contained within the .csv file -BioconductorFlow_path <- file.path(PathToDataFolder, "BioconductorFlow.csv") -BioconductorFlowPackages <- read.csv(BioconductorFlow_path, check.names=FALSE) -BioconductorFlowPackages <- BioconductorFlowPackages |> - arrange(desc(since)) |> mutate(package = factor(package, levels = package)) - -# Newer Base R Pipe : |> -# Older mostly equivalent Magrittr Pipe %>% -``` - ---- - -```{r} -#| echo: FALSE -#| fig-height: 9 - -# Notice the code-chunk eval arguments above dictate the shape of the final rendered plot. - -# Taking the imported dataset and passing it to ggplot2 to create the first plot. - -plot <- ggplot(BioconductorFlowPackages, - aes(x = 0, xend = since, y = package, yend = package)) + - geom_segment(linewidth = 2, color = "steelblue") + - scale_x_continuous(trans = "reverse", - breaks = seq(0, max(BioconductorFlowPackages$since), by = 5)) + - labs( - x = "Years in Bioconductor", - y = NULL, - title = "Bioconductor Flow Cytometry R packages" - ) + - theme_bw() - -# Taking the static plot and making it interactive using the plotly package - -plotly::ggplotly(plot) -``` - -::: - ---- - -::: {.fragment} - -```{r} -#| include: FALSE - -# Retrieving the names of Bioconductor flow cytometry R packages in correct release order. - -HistoricalOrder <- BioconductorFlowPackages |> pull(package) - -# Bringing in 2025 package usage dataset from a .csv file -BioconductorUsage_path <- file.path(PathToDataFolder, "BioconductorDownloads.csv") -BioconductorUsage <- read.csv(BioconductorUsage_path, check.names=FALSE) -BioconductorUsage <- BioconductorUsage |> dplyr::filter(Month %in% "all") - -# Note, dplyr::filter is used due to flowCore also having a filter function, which causes conflicts once it is attached to the local environment. - -# Combining both data.frames for use in the plot - -Dataset <- left_join(BioconductorFlowPackages, BioconductorUsage, by="package") - -# Rearranging the order in which packages are displayed - -Dataset$package <- factor(Dataset$package, levels=HistoricalOrder) -``` - ---- - -```{r} -#| echo: FALSE - -# Generating the 2nd plot with ggplot2 - -plot <- ggplot(Dataset, aes(x = since, y = Nb_of_distinct_IPs)) + - geom_point(aes(color = package), size = 3, alpha = 0.7) + - labs( - x = "Years in Bioconductor", - y = "Number of Yearly Downloads", - title = "", - color = "Package" - ) + - theme_bw() - -# Making it interactive with plotly - -plotly::ggplotly(plot) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -flowCore is also one of the many Bioconductor packages maintained by [Mike Jiang](https://github.com/mikejiang). In many ways (as those who completed the optional take-home problems for Week #1 know) reminiscent of this [xkcd](https://xkcd.com/2347/) comic: -::: -::: - ---- - -![](images/BioconductorXKCD.png) - - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As with all our R packages, we first need to make sure `flowCore` is attached to our local environment via the library call. -::: -::: - -::: {.fragment} -```{r} -library(flowCore) -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The function we will be using today is the `read.FCS()` function. Do you remember how to access the help documentation? -::: -::: - -::: {.fragment} -```{r} -#| code-fold: TRUE -#| eval: FALSE - -# Or when in Positron, hovering over the highlighted function name within the code-chunk - -?flowCore::read.FCS -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To start, lets select just the first .fcs file. We will do this by indexing the first item within fcs_files via the square brackets []. -::: -::: - -::: {.fragment} -```{r} -firstfile <- fcs_files[1] -firstfile -``` -::: - ---- - -## flowFrame - -::: {.fragment} -::: {.callout-tip title="."} -For `read.FCS()`, it accepts several arguments. The argument "filename" is where we provide our file.path to .fcs file that we wish to load into R. Let's go ahead and do so -::: -::: - -::: {.fragment} - -```{r} -#| eval: FALSE - -read.FCS(filename=firstfile) - -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Please note, if you are doing this with your own .fcs files, you will need to provide two additional arguments, "transformation" = FALSE, and "truncate_max_range" = FALSE for the files to be read in correctly. We will revisit the reasons why in Week #5. -::: -::: - -::: {.fragment} -```{r} -read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, we can see the .fcs file has been read into R as a "flowFrame" object. We can also see the file name, as well as details about the number of cells, and number of columns (whether detectors (for raw spectral flow data) or fluorophores (for unmixed spectral flow data)). -::: -::: - ---- - -![](images/00_flowFrame.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Directly below we see what resembles a table. At first glance, the only column with an immediately discernable purpose is the one with the name column, which is listing the detectors present on a [Cytek Aurora](https://bpb-us-w2.wpmucdn.com/voices.uchicago.edu/dist/2/1824/files/2021/10/Aurora-Configuration.png). -::: -::: - ---- - -![](images/01_flowFrameDetectors.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And finally, at the bottom we reach a line that tells us that for this .fcs files, 599 keyword can be found in a description slot. -::: -::: - ---- - -![](images/02_KeywordsFiveNineNine.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -So let's get our bearings, we have loaded in an .fcs file to R, but let's use some of the concepts we covered last week to try to understand a bit about what type or class of object we are working with. From the output, we saw the words flowFrame object, so let's read it back in again, but assign it to an variable/object called flowFrame so that we can use the type-discerning functions we worked with last week on. -::: -::: - -::: {.fragment} -```{r} -flowFrame <- read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As we create this variable, if we have the session tab selected on our right secondary side bar, we see it appear: -::: -::: - ---- - -![](images/03_SessionTab.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we were to use the type-determining functions we learned last week -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE -#| include: FALSE -# This is the whole ball game -str(flowFrame) -``` - -```{r} -class(flowFrame) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -flowFrames are a class of object with a structure defined within the `flowCore` package. They are used to work with the data contained within individual .fcs files. Looking again at the right secondary side bar, we can see that it shows up as a ""S4 class flowFrame package flowCore""" with 3 slots, with the words flowFrame adjacent to it. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -A perfectly valid first reaction to first reading this is "well how should I know what any of this means?". Powering through this initial discomfort, let's go ahead and click on the dropdown arrow next to the variables name and see if we get any additional clarity on the issue. -::: -::: - ---- - -![](images/04_Slots.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When we do so, three additional drop-downs appear. Based on the previous line that mentioned 3 slots, we could infer that each line corresponds to one of those slots. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -What we are encountering with flowFrame is our first example of an S4 object type. These more-complicated object types are quite common for the various [Bioconductor](https://adv-r.hadley.nz/s4.html) affilitated R packages. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -These objects will usually appear with either S4 or S3 in their metadata, and are made up of various simpler object types that are cobbled together within the larger object, usually occupying individual slots. -::: -::: - - -::: {.fragment} -::: {.callout-tip title="."} -What advantage this bundling provides will be something we revisit throughout the course as you encounter more of these S4/S3 objects. -::: -::: - ---- - -### exprs - -::: {.fragment} -::: {.callout-tip title="."} -The first slot within the flowFrame object shows up with the name "exprs". For the exprs object, glancing at it's middle column, we can based on the 100 rows and 61 columns, that it is likely a matrix-style object. We might also recall we saw similar numbers in the printed output when we ran `read.FCS()`earlier. -::: -::: - ---- - -![](images/00_flowFrame.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Which likely means that "exprs" slot is where the MFI data for the individual acquired cells within our .fcs file is being stored. Within Positron, for a matrix object, we can click on the little grid symbol on the far right to open up the table within editor. -::: -::: - ---- - -![](images/05_OpenTable.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we utilize the scroll bars, we can see that the individual detectors (in the case of uploading a raw spectral fcs file, they would appear as fluorophores for unmixed spectral or conventional fcs files) occupy the individual columns, which are named. The rows are not named, but number 100, matching the number of cells present in the .fcs file. Additionally, on the far left there is a little summary table about the overall data. -::: -::: - ---- - -![](images/06_TableInEditor.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Let's go ahead and assign this matrix to a new variable/object so that we can explore it later. Since flowFrame is an S4 object, it's slots can be individually accessed by adding the @ symbol and the respective slot name. -::: -::: - -::: {.fragment} -```{r} -MFI_Matrix <- flowFrame@exprs -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, we can use the Bioconductor helper function `exprs()` to get data held in that slot -::: -::: - -::: {.fragment} -```{r} -MFI_Matrix_Alternate <- exprs(flowFrame) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In the case of the above, this displayed text output to the console would be unwiedly to display all at once. If we wanted to only see the first five rows, we could use the `head()` function, and provide a value of 5. -::: -::: - -::: {.fragment} -```{r} -head(MFI_Matrix, 5) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This is much more workable, especially on a small laptop screen. We can see that there are names for each column corresponding to detector/fluorophore/metal depending on the .fcs file we are accessing. Lets retrieve these column names using the `colnames()` function. -::: -::: - -::: {.fragment} - -```{r} -ColumnNames <- colnames(MFI_Matrix) -ColumnNames -``` - -::: - -::: {.fragment} -::: {.callout-tip title="."} -Something interesting occurred when this occurred, we can see in addition to the detector names directly above each a "$P#N" pattern appear, with # standing for increasing numbers. If we recall, we saw something similar in the first output column when we first ran `read.FCS()`. -::: -::: - ---- - -![](images/00_flowFrame.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Lets break out the `str()` and `class()` functions from last week and see what we can find out about why this is occuring. -::: -::: - -::: {.fragment} - -```{r} -str(ColumnNames) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case we can see that we don't just have a vector (list) similar to what we saw with Fluorophores object last week, because instead of a chr [1:61] we get back a Named chr [1:61] designation. What we see is that in this case, each value has a corresponding index name as well. (ex. $P1N, $P2N, etc.) Let's double check with `class()` function. -::: -::: - -::: {.fragment} - -```{r} -class(ColumnNames) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can see that everything is character, but it doesn't inform us that each index was named. This is one of the reasons it is best when trying to see what type of an object something is, to use multiple functions, to avoid missing some important details. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -If we were trying to remove the names, being left with just the values (similar to what we saw with the vector-style list last week), we could use the `unname()` function: -::: -::: - -::: {.fragment} - -```{r} -unname(ColumnNames) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Let's return to the right sidebar to continue our exploration, by clicking on the dropdown arrow for exprs in the side-bar -::: -::: - ---- - -![](images/07_ExprsExpanded.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The output is less user-friendly than what we saw when clicking on the little grid. If we scroll down far enough, we get down as far as [,61], which corresponds to the total number of columns. -::: -::: - ---- - -![](images/08_LessFriendly.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In base R, column order can be defined by placing the corresponding column index number after a comma ",". So for this case, the first column would be designated would be [,1] while the last column would be designated [,61]. -::: -::: - -::: {.fragment} -```{r} -MFI_Matrix[,1] -``` - -::: - ---- - -::: {.fragment} -```{r} -MFI_Matrix[,61] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -What would happen if used a column index number that didn't exist? Let's check. -::: -::: - -::: {.fragment} -```{r} -#| error: TRUE - -MFI_Matrix[,350] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We get back an error message telling us the subscript is out of bounds. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -So if columns are specified by a number after the comma (ex. [,1]), how are rows specified? In R, rows would be specified by a number before the comma [1,] -::: -::: - -::: {.fragment} -```{r} -MFI_Matrix[1,] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And while not the focus of today, we could retrieve individual values from a matrix by specifying both a row and a column index number. So for example, if we wanted the MFI value for the UV1-A detector for the first acquired cell (knowing that UV1-A is the 2nd column): -::: -::: - -::: {.fragment} -```{r} -MFI_Matrix[1,2] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -From our exploration, this looks to be all the information contained within the "exprs" slot, so let's back up and check on the next slot. -::: -::: - ---- - -### parameters - -::: {.fragment} -::: {.callout-tip title="."} -As we look at the next slot in the flowFrame object, we can see that parameters looks like it is going to be another more complex object, as it is showing up as an AnnotatedDataFrame object (defined by the Biobase R package, and itself contains 4 slots). -::: -::: - ---- - -![](images/09_Parameters.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having carved our way this far into the heart of an .fcs file, we are not about to call it quits now, so [CHARGE](https://youtu.be/92gP2J0CUjc?t=72) my fellow cytometrist!!! Click that drop-down arrow! -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Having survived our charge into the unknown, the four parameter slots appear to be "varMetadata", "data", "dimLabels" and "._classVersion_". -::: -::: - ---- - -![](images/10_ParameterSlots.png) - ---- - -#### varMetadata - -::: {.fragment} -::: {.callout-tip title="."} -Fortunately for us, both "varMetadata" and "data" at least appear to be table-like objects of a type known as a "data.frame", so lets click on the grid to open in our editor window. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In the case of varMetadata, we seem to have retrieved a column of metadata names. -::: -::: - ---- - -![](images/11_varMetadata.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -These look reminiscent of what we saw at the top of the `read.FCS()` column outputs previously -::: -::: - ---- - -![](images/12_varMetadata2.png) - ---- - -#### data - -::: {.fragment} -::: {.callout-tip title="."} -Clicking on the grid for parameters's data slot will end opening the actual content that was displayed. -::: -::: - ---- - -![](images/13_data.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Let's try to retrieve the data contained within this slot and save it as it's own variable/object within our R session. First, we need to open flowFrame object, then use @ to get inside its parameters slot. Since parameters is also a complex object (AnnotatedDataFrame specifically), we will need to use another @ to get inside its data slot: -::: -::: - -::: {.fragment} -```{r} -ParameterData <- flowFrame@parameters@data - -head(ParameterData, 10) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And similarly, we could access with the Bioconductor helper function `parameters()`, but we would need to specify the accessor for data outside the parenthesis. -::: -::: - -::: {.fragment} -```{r} -ParameterData_Alternate <- parameters(flowFrame)@data -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we ran the `str()` function, we get the following insight into ParameterData's object type -::: -::: - -::: {.fragment} -```{r} -str(ParameterData) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can see this class of object is a "data.frame". This is one of the more common object types in R, and we will be seeing these extensively throughout the course. We see that each of the columns appears to be designated by a $ followed by the column name, and then type of column (numeric, character, etc). -::: -::: - ---- - -![](images/15_dataframe.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we are trying to see these columns in R, we notice that data.frame is not like the previous S4 class objets we interacted with, as the @ symbol after doesn't bring up any suggestions -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE - -ParameterData@ -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, adding the $ we saw when using the `str()` function does retrieve the underlying information -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE -ParameterData$ -``` -::: - ---- - -![](images/15_Suggestions.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -As you become more familiar with R, remembering to check what kind of object you are working with, and how to access the contents will with practice become more familiar to you. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Similar to what we saw with a matrix, we can subset a data.frame based on the column or row index using square brackets []. -::: -::: - -::: {.fragment} -```{r} -ParameterData[,1] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The individual detectors or fluorophore appear under "name". For now, based on what we know, the $P# appears to be some sort of name being used as an internal consistent reference to the respective. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -"desc" is appearing empty for this raw spectral fcs file, but if you were to checked an unmixed file, this would be occupied the marker/ligand name assigned to it during the experiment setup. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -"range", "minRange" and "maxRange" are beyond the scope of today, but are used by both instrument manufacturers and software vendors when setting appropiate scaling for a plot. For the actual details, see the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation. -::: -::: - -::: {.fragment} -::: {.callout-tip title="."} -Having exhausted our options under parameters "varMetadata" and "data" slots, let's continue to the next slot. -::: -::: - ---- - -#### dimLabels - -![](images/16_DimLabels.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In this case, not much is returned. Yey! -::: -::: - -::: {.fragment} -```{r} -flowFrame@parameters@dimLabels -``` - -::: - ---- - -#### classVersion - -::: {.fragment} -::: {.callout-tip title="."} -Continuing on to the last slot ".__classVersion__" -::: -::: - -::: {.fragment} -```{r} -flowFrame@parameters@.__classVersion__ -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Also mercifully short, both of these seem to be more involved in defining the S4 class object, and don't contain anything we need to retrieve today. -::: -::: - ---- - -### Description - -::: {.fragment} -::: {.callout-tip title="."} -At this point, we have explored both "exprs" and "parameter" slots for the flowFrame object we created. Let's tackle the final slot, named description. -::: -::: - -::: {.fragment} -![](images/17_Description.png) -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When doing so, a very large list is opened within the Positron variables window. While we could scroll through it, it might be easier to retrieve certain number of rows via the console to make interpreting this more structured. -::: -::: - ---- - -![](images/18_List.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -To retrieve the list itself, we would need to access the description slot of the flowFrame object. Since it is a slot, we will need to use the @ accessor. -::: -::: - - - - -::: {.fragment} -```{r} -DescriptionList <- flowFrame@description -``` -::: - ---- - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -DescriptionList -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -The returned list is a little too large to reasonably explore. We can attempt to subset using the `head()` function as shown below -::: -::: - -::: {.fragment} -```{r} -head(DescriptionList, 5) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, it might be better to subset based on position index -::: -::: - -::: {.fragment} -```{r} -DescriptionList[1:10] -``` -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And just as we saw for exprs and parameters, there is also a Bioconductor helper `keyword()` function to access this same information directly from the flowFrame. -::: -::: - -::: {.fragment} -```{r} -DescriptionList_Alternate <- keyword(flowFrame) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -If we run the `class()` function, we can see that DescriptionList is an actual "list". -::: -::: - -::: {.fragment} -```{r} -class(DescriptionList) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This is in contrast to the vectors we have previously generated. While these are also list like, they are what are known as as atomic list, which contain values that are all either characters, numerics or logicals. -::: -::: - -::: {.fragment} -```{r} -Fluorophores <- c("BV421", "FITC", "PE", "APC") -class(Fluorophores) -``` - -::: - -::: {.fragment} -```{r} -PanelAntibodyCounts <- c(5, 12, 19, 26, 34, 46, 51) -class(PanelAntibodyCounts) -``` - -::: - -::: {.fragment} -```{r} -SpecimenIndexToKeep <- c(TRUE, TRUE, FALSE, TRUE) -class(SpecimenIndexToKeep) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -A list on the other hand is not restricted to contain objects composed entirely of a certain atomic type. For example, I could include the three previous vectors into a list using the `list()` function. -::: -::: - -::: {.fragment} -```{r} -MyListofVectors <- list(Fluorophores, PanelAntibodyCounts, SpecimenIndexToKeep) -str(MyListofVectors) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We can see that with the Description/Keyword list we retrieved from our flowFrame shares a somewhat similar format. -::: -::: - -::: {.fragment} -```{r} -str(DescriptionList[1:10]) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -But in this case, there are also names present ($BEGINANALYSIS, $BEGINDATA, etc). What if we had tried to provide names to our List of Vectors? Would the format match? -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When we assigned a name to each of the vectors (by providing an equal to = ), we get the same kind of structure format to what we see in Description. -::: -::: - -::: {.fragment} -```{r} -MyNamedListofVectors <- list(FluorophoresNamed=Fluorophores, - PanelAntibodyCountsNamed=PanelAntibodyCounts, - SpecimenIndexToKeepNamed=SpecimenIndexToKeep) - -str(MyNamedListofVectors) -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -We could then subsequently be able to isolate items from that list using the $ operator. -::: -::: - -::: {.fragment} -```{r} -#| eval: FALSE -MyNamedListofVectors$ -``` - -::: - -::: {.fragment} -![](images/20_ListAccess.png) -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Alternatively, we could also access by list index position -::: -::: - -::: {.fragment} -```{r} -MyNamedListofVectors[1] -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Remembering back to the original output from `read.FCS()` we remember that it mentioned 599 keywords being in the description slot, so now we know that this is what was being referenced. -::: -::: - ---- - -![](images/00_flowFrame.png) - ---- - -# Keyword Madness - -::: {.fragment} -::: {.callout-tip title="."} -Rather than go through the keywords individually (in which case we would be here through tomorrow), let's take a birds eye view of the contents of this list. -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Subset <- DescriptionList[1:18] -Subset -``` - -::: - ---- - -## Early Metadata - -::: {.fragment} -::: {.callout-tip title="."} -Within the initial portion, we are getting back metadata keywords related to where and how the particular file was acquired. Keywords of potential interest include: -::: -::: - -::: {.fragment} -:::{.callout-tip title="Start Time"} -What time was the .fcs file acquired -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$BTIM` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Cytometer"} -What type of cytometer was the .fcs file acquired on -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$CYT` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Cytometer Serial Number"} -Manufacturer Serial Number of the Cytometer -::: -::: - -::: {.fragment} -```{r} -DescriptionList$`$CYTSN` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="FCS File Acquisition Date"} -What was the date of acquisition -::: -::: - -::: {.fragment} -```{r} -DescriptionList$`$DATE` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Acquisition End Time"} -What time was acquisition stopped -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$ETIM` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="File Name"} -Name of the .fcs file -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$FIL` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Operator"} -Who acquired the .fcs file -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$OP` -``` - -::: - ---- - -## Detector Values - -::: {.fragment} -::: {.callout-tip title="."} -The next major stretch of keywords encode parameter values associated with the individual detectors for at the time of acquisition. -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[20:384] -Detectors -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Fortunately for all involved, there is a consistently repeating pattern for the keywords corresponding to each detector. We can see that here for $P7B, $P7E, $P7N, $P7R, $P7TYPE, $P7V -::: -::: - ---- - -![](images/21_DetectorIteration.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -When referencing to the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation, here are what the particular keyword letters mean: -::: -::: - ---- - -::: {.fragment} -:::{.callout-tip title="B"} -Number of bits reserved for parameter number n -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7B` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="E"} -Amplification type for parameter n. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7E` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="N"} -Short Name for parameter n. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7N` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="R"} -Range for parameter number n. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7R` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="TYPE"} -Detector type for parameter n. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7TYPE` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="V"} -Detector voltage for parameter n. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$P7V` -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -While not immediately obvious, understanding what these keywords encoded has proven useful for our core. In our case, we have built an automated [InstrumentQC dashboard](https://umgccfcss.github.io/InstrumentQC/Aurora3L.html) for all the instruments at our core. -::: -::: - ---- - -![](images/InstrumentQC.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By extracting out from our daily QC bead .fcs files the stored **N (Detector Name)** and **V (Gain/Voltage)** values for all the individual detectors, it allows us to plot Levey-Jennings Plots for our individual instruments, giving us usually around a months warning before an individual laser begins to fail. This helps with scheduling the Field-Service Engineer visit before it starts impacting the actual data. -::: -::: - ---- - -![](images/LeveyJennings.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -While most of the detectors keywords are similar (only changing there individual name and voltage) there are a couple exceptions. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -For the FSC/SSC parameters, instead of Raw_Fluorescence value for Type, we see the corresponding Scatter value get return. This in term is what is used by various commercial softwares to show those axis as linear instead of biexponential when selected. -::: -::: - ---- - -![](images/22_FSC.png) - ---- - -::: {.fragment} -::: {.callout-tip title="."} -This is similarly the case for the Time parameter, where in addition to Type being set to Time, the range also appears different to Raw/Scatters value. -::: -::: - ---- - -![](images/23_Time.png) - ---- - -## Middle Metadata - -::: {.fragment} -::: {.callout-tip title="."} -Once we are out of the detector keywords, we find the last of the $Metadata associated keywords. -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[385:398] -Detectors -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Among those of potential interest -::: -::: - -::: {.fragment} -:::{.callout-tip title="Proj"} -Often corresponding to the experiment file name -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$PROJ` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Spillover"} -Where the internal spillover matrix is stored (we will revisit during compensation) -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$SPILLOVER` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="TOT"} -Total events (in this case my downsampled 100 cells) -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$TOT` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Volume"} -Volume amount acquired during acquisition. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$`$VOL` -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="Software"} -Software used and version -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$CREATOR -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -You will notice at this point, the keyword names including a "$" symbol have stopped, so tick marks are no longer required (except when there is a space in the name). The only $ remaining is being used as a selector for a particular item in the list. -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[390:398] -Detectors -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="FILENAME"} -Basically the full file.path to the .fcs file of interest. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$FILENAME -``` - -::: - ---- - -::: {.fragment} -:::{.callout-tip title="GROUPNAME"} -The Name assigned to the acquisition Group. -::: -::: - -::: {.fragment} - -```{r} -DescriptionList$GROUPNAME -``` - -::: - ---- - -## Laser Metadata - -::: {.fragment} -::: {.callout-tip title="."} -Next up, there is a small stretch of keywords containing the values associated with the individual lasers as far as delays and area scaling factors for a particular day (also useful when [plotted](https://umgccfcss.github.io/InstrumentQC/Aurora5L.html)). -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[399:410] -Detectors -``` - -::: - ---- - -## Display - -::: {.fragment} -::: {.callout-tip title="."} -Then there is a stretch matching whether a particular detector needs to be displayed as linear (in the case of time and scatter) or as log (for individual detectors). -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[412:472] -Detectors -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -And a few final keywords with threshold, window scaling and other user selected settings. -::: -::: - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -Detectors <- DescriptionList[473:476] -Detectors -``` - -::: - ---- - -## flowCore Parameters - -::: {.fragment} -::: {.callout-tip title="."} -Depending on the arguments selected during `read.FCS()`, we might also encounter additional keywords that are added in by flowCore. For example, we do not see these keywords when "transformation" is set to FALSE. -::: -::: - -::: {.fragment} -```{r} -flowCoreCheck <- read.FCS(filename=firstfile, - transformation = FALSE, truncate_max_range = FALSE) - -flowCoreCheck -``` - -::: - ---- - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -NoChange <- keyword(flowCoreCheck) -Detectors <- NoChange [476:500] -Detectors -``` - -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -By contrast, if we had set "transformation" to TRUE: -::: -::: - -::: {.fragment} -```{r} -flowCoreCheck <- read.FCS(filename=firstfile, - transformation = TRUE, truncate_max_range = FALSE) - -flowCoreCheck -``` - -::: - ---- - -::: {.fragment} -```{r} -#| class-output: "scroll-output" -YesChange <- keyword(flowCoreCheck) -Detectors <- YesChange [476:500] -Detectors -``` - -::: ---- - -::: {.fragment} -::: {.callout-tip title="."} -For some flow cytometry R packages, you will notice when opening their exported .fcs outputs in commercial software that these flowCore keywords have ended up integrated. It is likely somewhere in the package code the author forgot to add set transformation to FALSE, which is why we are seeing these flowCore keywords after the fact. -::: -::: - ---- - -# Take Away - -::: {.fragment} -::: {.callout-tip title="."} -Today we broke open an .fcs file and explored how the underlying data is organized and stored once it is brought into R. In the process, we continued to build familiarity with some of the basic R knowledge, going from smaller simpler objects we encountered in week 2 to matrices and data.frames, to complex objects with multiple slots typical of what we encounter in the Bioconductor packages. We will build on these initial observations on the weeks to come. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -In context of our continuing analogy, with each function being a tool, and an R package a toolbox, each tool in the toolbox works on different types of objects. A hammer needs nails, screwdrivers need screws, a paintbrush needs paint and a wall, etc. Object types help define these requirements, so when we use a function, knowing what type can help determine what we provide to it in order for it to work properly and not error out. -::: -::: - ---- - -::: {.fragment} -::: {.callout-tip title="."} -Next week, we will dive into the world of [tidyverse](https://tidyverse.org/), working specifically with these intermediate object types matrices and data.frames. The basic premise is to think of all data as rows and columns, the reasoning behind this approach which can be found [here](https://vita.had.co.nz/papers/tidy-data.html). -::: -::: - ---- - -![](images/TakeAway.jpg) - ---- - -# Additional Resources - -[Data File Standard for Flow Cytometry, Version FCS 3.1](https://pmc.ncbi.nlm.nih.gov/articles/PMC2892967/) - -[R Programming - R Data Types: Vectors and Lists](https://youtu.be/p01ckVx-678?si=BQp6SFTWfZzz2-wI) - -[Base Types vs. Object-Oriented Objects](https://adv-r.hadley.nz/base-types.html) - ---- - -# Take-home Problems - -:::{.callout-tip title="Problem 1"} -Today's walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26...). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc. -::: - ---- - -:::{.callout-tip title="Problem 2"} -Today's files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22...). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc) -::: - ---- - -:::{.callout-tip title="Problem 3"} -If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using [Floreada.io](/course/00_Floreada/index.qmd). -::: - ---- - -![](images/TakeAway.jpg) - -::: {style="text-align: right;"} -[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +--- +title: "03 - Inside an FCS File" +author: "David Rach" +date: 02-16-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +--- + +# Background + + +::: {.fragment} +::: {.callout-tip title="."} +Welcome to the Week #3! Having subjected everyone to two R-focused weeks, this week will have more of a cytometry-focus as we slice into an .fcs file. + +We will hopefully gather greater understanding of how an .fcs file is structured and what additional kinds of information we can retrieve (while becoming increasingly puzzled why different manufacturers insist on using different keyword names for the exact same things). +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will also gain additional exposure to more object types in R (vectors, list, matrices and data.frames). + + Continuing the analogy from last week, if every function is the equivalent of a tool in a toolbox, each tool requires certain types of things to do its job properly (hammer ~ nail, screwdriver ~ screws, paintbrush ~ paint, etc.). + + Being able to identify what type/kind of object a particular variable we have created in R is will allow us to pass it to the correct function that will allow us to work with that object type. +::: +::: + +--- + +:::{.callout-important title="Housekeeping"} +We are building off concepts that were covered in [Week #1 (Installing R packages)](/course/01_InstallingRPackages/index.qmd) and especially [Week #2 (File Paths)](/course/02_FilePaths/index.qmd). +For those who are flow cytometry beginners, please see [UChicago Flow](https://youtu.be/gC4brjHbLkk?si=li98x7KlLXUFWGX3) Flow Basics Series for additional context. +::: + + +:::{.callout-tip title="Today's Goal"} +If you find yourself at some point going "I have no idea what is going on", please pause, take a break, and circle back later in the day. Our goal is not to have you memorize how to quickly access 100 archaic keywords, but rather showcase a typical object exploration workflow. + +So don't power through, but rather circle back when you are in an exploring mindset. Consider what kind of information from within an .fcs file you'd like to retrieve, and then explore/navigate your way through the various paths until you find the information that you were looking for. +::: + +--- + +:::{.callout-important title="Housekeeping"} +As we do [every week](/course/02_FilePaths/index.qmd#new-repository), on GitHub, sync your forked-version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. From there, copy the data folder to a separate project folder you have created. This will prevent any merge issues bringing in new data next week. +::: + +--- + +# Walk Through + +--- + +## Getting Set Up + +--- + +### Set up File Paths + +::: {.fragment} +::: {.callout-tip title="."} +Having copied over the new data to your working project folder (Week 3 or whatever your chosen name), let's identify the file paths between our working directory and the fcs files. If you retained the same project organization structure we had during Week #2, it may look similar to the following: +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +#| include: FALSE + +# Please note, this code-chunk is only for use when writing the code. Please switch eval to false and next code blocks eval to true before rendering + +PathToDataFolder <- file.path(getwd(), "course", "03_InsideFCSFile", "data") +``` + +```{r} +#| eval: TRUE +PathToDataFolder <- file.path("data") +``` + +```{r} +PathToDataFolder +``` + +::: + +--- + +### Locate .fcs files + +::: {.fragment} +::: {.callout-tip title="."} +We will now locate our .fcs files. As we saw last week, our computer will need the full file.paths to these individual files, so we will set the `list.files()` "full.names" argument to TRUE. +::: +::: + +::: {.fragment} +```{r} +#| eval: TRUE +fcs_files <- list.files(PathToDataFolder, pattern=".fcs", full.names=TRUE) +fcs_files +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, if the "full.names" argument was set to FALSE, we would have retrieved just the file names +::: +::: + +::: {.fragment} +```{r} +list.files(PathToDataFolder, pattern=".fcs", full.names=FALSE) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This would have been the equivalent of running the `basename` function on the "full.names=TRUE" output. +::: +::: + +::: {.fragment} +```{r} +basename(fcs_files) +``` + +::: + + +--- + +## flowCore + +::: {.fragment} +::: {.callout-tip title="."} +We will be using the `flowCore` package, which is the oldest and most-frequently downloaded flow cytometry package on [Bioconductor](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry). +::: +::: + +--- + +::: {.fragment} + +```{r} +#| include: FALSE +#| warning: FALSE +#| message: FALSE + +# I have attached this code for anyone that is interested in seeing how these plots were made. The content is not part of today's lesson, so if you are just starting off, we will cover the details of data-tidying and creating ggplot objects over the next several weeks. Best, David + +# Load required packages via a library call + +library(dplyr) # CRAN +library(stringr) # CRAN +library(ggplot2) # CRAN +#library(plotly) # Using the :: to access + +# Loading in the dataset contained within the .csv file +BioconductorFlow_path <- file.path(PathToDataFolder, "BioconductorFlow.csv") +BioconductorFlowPackages <- read.csv(BioconductorFlow_path, check.names=FALSE) +BioconductorFlowPackages <- BioconductorFlowPackages |> + arrange(desc(since)) |> mutate(package = factor(package, levels = package)) + +# Newer Base R Pipe : |> +# Older mostly equivalent Magrittr Pipe %>% +``` + +--- + +```{r} +#| echo: FALSE +#| fig-height: 9 + +# Notice the code-chunk eval arguments above dictate the shape of the final rendered plot. + +# Taking the imported dataset and passing it to ggplot2 to create the first plot. + +plot <- ggplot(BioconductorFlowPackages, + aes(x = 0, xend = since, y = package, yend = package)) + + geom_segment(linewidth = 2, color = "steelblue") + + scale_x_continuous(trans = "reverse", + breaks = seq(0, max(BioconductorFlowPackages$since), by = 5)) + + labs( + x = "Years in Bioconductor", + y = NULL, + title = "Bioconductor Flow Cytometry R packages" + ) + + theme_bw() + +# Taking the static plot and making it interactive using the plotly package + +plotly::ggplotly(plot) +``` + +::: + +--- + +::: {.fragment} + +```{r} +#| include: FALSE + +# Retrieving the names of Bioconductor flow cytometry R packages in correct release order. + +HistoricalOrder <- BioconductorFlowPackages |> pull(package) + +# Bringing in 2025 package usage dataset from a .csv file +BioconductorUsage_path <- file.path(PathToDataFolder, "BioconductorDownloads.csv") +BioconductorUsage <- read.csv(BioconductorUsage_path, check.names=FALSE) +BioconductorUsage <- BioconductorUsage |> dplyr::filter(Month %in% "all") + +# Note, dplyr::filter is used due to flowCore also having a filter function, which causes conflicts once it is attached to the local environment. + +# Combining both data.frames for use in the plot + +Dataset <- left_join(BioconductorFlowPackages, BioconductorUsage, by="package") + +# Rearranging the order in which packages are displayed + +Dataset$package <- factor(Dataset$package, levels=HistoricalOrder) +``` + +--- + +```{r} +#| echo: FALSE + +# Generating the 2nd plot with ggplot2 + +plot <- ggplot(Dataset, aes(x = since, y = Nb_of_distinct_IPs)) + + geom_point(aes(color = package), size = 3, alpha = 0.7) + + labs( + x = "Years in Bioconductor", + y = "Number of Yearly Downloads", + title = "", + color = "Package" + ) + + theme_bw() + +# Making it interactive with plotly + +plotly::ggplotly(plot) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +flowCore is also one of the many Bioconductor packages maintained by [Mike Jiang](https://github.com/mikejiang). In many ways (as those who completed the optional take-home problems for Week #1 know) reminiscent of this [xkcd](https://xkcd.com/2347/) comic: +::: +::: + +--- + +![](images/BioconductorXKCD.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As with all our R packages, we first need to make sure `flowCore` is attached to our local environment via the library call. +::: +::: + +::: {.fragment} +```{r} +library(flowCore) +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The function we will be using today is the `read.FCS()` function. Do you remember how to access the help documentation? +::: +::: + +::: {.fragment} +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# Or when in Positron, hovering over the highlighted function name within the code-chunk + +?flowCore::read.FCS +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To start, lets select just the first .fcs file. We will do this by indexing the first item within fcs_files via the square brackets []. +::: +::: + +::: {.fragment} +```{r} +firstfile <- fcs_files[1] +firstfile +``` +::: + +--- + +## flowFrame + +::: {.fragment} +::: {.callout-tip title="."} +For `read.FCS()`, it accepts several arguments. The argument "filename" is where we provide our file.path to .fcs file that we wish to load into R. Let's go ahead and do so +::: +::: + +::: {.fragment} + +```{r} +#| eval: FALSE + +read.FCS(filename=firstfile) + +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Please note, if you are doing this with your own .fcs files, you will need to provide two additional arguments, "transformation" = FALSE, and "truncate_max_range" = FALSE for the files to be read in correctly. We will revisit the reasons why in Week #5. +::: +::: + +::: {.fragment} +```{r} +read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, we can see the .fcs file has been read into R as a "flowFrame" object. We can also see the file name, as well as details about the number of cells, and number of columns (whether detectors (for raw spectral flow data) or fluorophores (for unmixed spectral flow data)). +::: +::: + +--- + +![](images/00_flowFrame.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Directly below we see what resembles a table. At first glance, the only column with an immediately discernable purpose is the one with the name column, which is listing the detectors present on a [Cytek Aurora](https://bpb-us-w2.wpmucdn.com/voices.uchicago.edu/dist/2/1824/files/2021/10/Aurora-Configuration.png). +::: +::: + +--- + +![](images/01_flowFrameDetectors.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And finally, at the bottom we reach a line that tells us that for this .fcs files, 599 keyword can be found in a description slot. +::: +::: + +--- + +![](images/02_KeywordsFiveNineNine.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +So let's get our bearings, we have loaded in an .fcs file to R, but let's use some of the concepts we covered last week to try to understand a bit about what type or class of object we are working with. From the output, we saw the words flowFrame object, so let's read it back in again, but assign it to an variable/object called flowFrame so that we can use the type-discerning functions we worked with last week on. +::: +::: + +::: {.fragment} +```{r} +flowFrame <- read.FCS(filename=firstfile, transformation = FALSE, truncate_max_range = FALSE) +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we create this variable, if we have the session tab selected on our right secondary side bar, we see it appear: +::: +::: + +--- + +![](images/03_SessionTab.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were to use the type-determining functions we learned last week +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +#| include: FALSE +# This is the whole ball game +str(flowFrame) +``` + +```{r} +class(flowFrame) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +flowFrames are a class of object with a structure defined within the `flowCore` package. They are used to work with the data contained within individual .fcs files. Looking again at the right secondary side bar, we can see that it shows up as a ""S4 class flowFrame package flowCore""" with 3 slots, with the words flowFrame adjacent to it. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +A perfectly valid first reaction to first reading this is "well how should I know what any of this means?". Powering through this initial discomfort, let's go ahead and click on the dropdown arrow next to the variables name and see if we get any additional clarity on the issue. +::: +::: + +--- + +![](images/04_Slots.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When we do so, three additional drop-downs appear. Based on the previous line that mentioned 3 slots, we could infer that each line corresponds to one of those slots. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +What we are encountering with flowFrame is our first example of an S4 object type. These more-complicated object types are quite common for the various [Bioconductor](https://adv-r.hadley.nz/s4.html) affilitated R packages. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +These objects will usually appear with either S4 or S3 in their metadata, and are made up of various simpler object types that are cobbled together within the larger object, usually occupying individual slots. +::: +::: + + +::: {.fragment} +::: {.callout-tip title="."} +What advantage this bundling provides will be something we revisit throughout the course as you encounter more of these S4/S3 objects. +::: +::: + +--- + +### exprs + +::: {.fragment} +::: {.callout-tip title="."} +The first slot within the flowFrame object shows up with the name "exprs". For the exprs object, glancing at it's middle column, we can based on the 100 rows and 61 columns, that it is likely a matrix-style object. We might also recall we saw similar numbers in the printed output when we ran `read.FCS()`earlier. +::: +::: + +--- + +![](images/00_flowFrame.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which likely means that "exprs" slot is where the MFI data for the individual acquired cells within our .fcs file is being stored. Within Positron, for a matrix object, we can click on the little grid symbol on the far right to open up the table within editor. +::: +::: + +--- + +![](images/05_OpenTable.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we utilize the scroll bars, we can see that the individual detectors (in the case of uploading a raw spectral fcs file, they would appear as fluorophores for unmixed spectral or conventional fcs files) occupy the individual columns, which are named. The rows are not named, but number 100, matching the number of cells present in the .fcs file. Additionally, on the far left there is a little summary table about the overall data. +::: +::: + +--- + +![](images/06_TableInEditor.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's go ahead and assign this matrix to a new variable/object so that we can explore it later. Since flowFrame is an S4 object, it's slots can be individually accessed by adding the @ symbol and the respective slot name. +::: +::: + +::: {.fragment} +```{r} +MFI_Matrix <- flowFrame@exprs +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we can use the Bioconductor helper function `exprs()` to get data held in that slot +::: +::: + +::: {.fragment} +```{r} +MFI_Matrix_Alternate <- exprs(flowFrame) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the case of the above, this displayed text output to the console would be unwiedly to display all at once. If we wanted to only see the first five rows, we could use the `head()` function, and provide a value of 5. +::: +::: + +::: {.fragment} +```{r} +head(MFI_Matrix, 5) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is much more workable, especially on a small laptop screen. We can see that there are names for each column corresponding to detector/fluorophore/metal depending on the .fcs file we are accessing. Lets retrieve these column names using the `colnames()` function. +::: +::: + +::: {.fragment} + +```{r} +ColumnNames <- colnames(MFI_Matrix) +ColumnNames +``` + +::: + +::: {.fragment} +::: {.callout-tip title="."} +Something interesting occurred when this occurred, we can see in addition to the detector names directly above each a "$P#N" pattern appear, with # standing for increasing numbers. If we recall, we saw something similar in the first output column when we first ran `read.FCS()`. +::: +::: + +--- + +![](images/00_flowFrame.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Lets break out the `str()` and `class()` functions from last week and see what we can find out about why this is occuring. +::: +::: + +::: {.fragment} + +```{r} +str(ColumnNames) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case we can see that we don't just have a vector (list) similar to what we saw with Fluorophores object last week, because instead of a chr [1:61] we get back a Named chr [1:61] designation. What we see is that in this case, each value has a corresponding index name as well. (ex. $P1N, $P2N, etc.) Let's double check with `class()` function. +::: +::: + +::: {.fragment} + +```{r} +class(ColumnNames) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can see that everything is character, but it doesn't inform us that each index was named. This is one of the reasons it is best when trying to see what type of an object something is, to use multiple functions, to avoid missing some important details. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +If we were trying to remove the names, being left with just the values (similar to what we saw with the vector-style list last week), we could use the `unname()` function: +::: +::: + +::: {.fragment} + +```{r} +unname(ColumnNames) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's return to the right sidebar to continue our exploration, by clicking on the dropdown arrow for exprs in the side-bar +::: +::: + +--- + +![](images/07_ExprsExpanded.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The output is less user-friendly than what we saw when clicking on the little grid. If we scroll down far enough, we get down as far as [,61], which corresponds to the total number of columns. +::: +::: + +--- + +![](images/08_LessFriendly.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In base R, column order can be defined by placing the corresponding column index number after a comma ",". So for this case, the first column would be designated would be [,1] while the last column would be designated [,61]. +::: +::: + +::: {.fragment} +```{r} +MFI_Matrix[,1] +``` + +::: + +--- + +::: {.fragment} +```{r} +MFI_Matrix[,61] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +What would happen if used a column index number that didn't exist? Let's check. +::: +::: + +::: {.fragment} +```{r} +#| error: TRUE + +MFI_Matrix[,350] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We get back an error message telling us the subscript is out of bounds. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +So if columns are specified by a number after the comma (ex. [,1]), how are rows specified? In R, rows would be specified by a number before the comma [1,] +::: +::: + +::: {.fragment} +```{r} +MFI_Matrix[1,] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And while not the focus of today, we could retrieve individual values from a matrix by specifying both a row and a column index number. So for example, if we wanted the MFI value for the UV1-A detector for the first acquired cell (knowing that UV1-A is the 2nd column): +::: +::: + +::: {.fragment} +```{r} +MFI_Matrix[1,2] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +From our exploration, this looks to be all the information contained within the "exprs" slot, so let's back up and check on the next slot. +::: +::: + +--- + +### parameters + +::: {.fragment} +::: {.callout-tip title="."} +As we look at the next slot in the flowFrame object, we can see that parameters looks like it is going to be another more complex object, as it is showing up as an AnnotatedDataFrame object (defined by the Biobase R package, and itself contains 4 slots). +::: +::: + +--- + +![](images/09_Parameters.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having carved our way this far into the heart of an .fcs file, we are not about to call it quits now, so [CHARGE](https://youtu.be/92gP2J0CUjc?t=72) my fellow cytometrist!!! Click that drop-down arrow! +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having survived our charge into the unknown, the four parameter slots appear to be "varMetadata", "data", "dimLabels" and "._classVersion_". +::: +::: + +--- + +![](images/10_ParameterSlots.png) + +--- + +#### varMetadata + +::: {.fragment} +::: {.callout-tip title="."} +Fortunately for us, both "varMetadata" and "data" at least appear to be table-like objects of a type known as a "data.frame", so lets click on the grid to open in our editor window. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the case of varMetadata, we seem to have retrieved a column of metadata names. +::: +::: + +--- + +![](images/11_varMetadata.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +These look reminiscent of what we saw at the top of the `read.FCS()` column outputs previously +::: +::: + +--- + +![](images/12_varMetadata2.png) + +--- + +#### data + +::: {.fragment} +::: {.callout-tip title="."} +Clicking on the grid for parameters's data slot will end opening the actual content that was displayed. +::: +::: + +--- + +![](images/13_data.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's try to retrieve the data contained within this slot and save it as it's own variable/object within our R session. First, we need to open flowFrame object, then use @ to get inside its parameters slot. Since parameters is also a complex object (AnnotatedDataFrame specifically), we will need to use another @ to get inside its data slot: +::: +::: + +::: {.fragment} +```{r} +ParameterData <- flowFrame@parameters@data + +head(ParameterData, 10) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And similarly, we could access with the Bioconductor helper function `parameters()`, but we would need to specify the accessor for data outside the parenthesis. +::: +::: + +::: {.fragment} +```{r} +ParameterData_Alternate <- parameters(flowFrame)@data +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we ran the `str()` function, we get the following insight into ParameterData's object type +::: +::: + +::: {.fragment} +```{r} +str(ParameterData) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can see this class of object is a "data.frame". This is one of the more common object types in R, and we will be seeing these extensively throughout the course. We see that each of the columns appears to be designated by a $ followed by the column name, and then type of column (numeric, character, etc). +::: +::: + +--- + +![](images/15_dataframe.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we are trying to see these columns in R, we notice that data.frame is not like the previous S4 class objets we interacted with, as the @ symbol after doesn't bring up any suggestions +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE + +ParameterData@ +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, adding the $ we saw when using the `str()` function does retrieve the underlying information +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +ParameterData$ +``` +::: + +--- + +![](images/15_Suggestions.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As you become more familiar with R, remembering to check what kind of object you are working with, and how to access the contents will with practice become more familiar to you. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to what we saw with a matrix, we can subset a data.frame based on the column or row index using square brackets []. +::: +::: + +::: {.fragment} +```{r} +ParameterData[,1] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The individual detectors or fluorophore appear under "name". For now, based on what we know, the $P# appears to be some sort of name being used as an internal consistent reference to the respective. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +"desc" is appearing empty for this raw spectral fcs file, but if you were to checked an unmixed file, this would be occupied the marker/ligand name assigned to it during the experiment setup. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +"range", "minRange" and "maxRange" are beyond the scope of today, but are used by both instrument manufacturers and software vendors when setting appropiate scaling for a plot. For the actual details, see the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +Having exhausted our options under parameters "varMetadata" and "data" slots, let's continue to the next slot. +::: +::: + +--- + +#### dimLabels + +![](images/16_DimLabels.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, not much is returned. Yey! +::: +::: + +::: {.fragment} +```{r} +flowFrame@parameters@dimLabels +``` + +::: + +--- + +#### classVersion + +::: {.fragment} +::: {.callout-tip title="."} +Continuing on to the last slot ".__classVersion__" +::: +::: + +::: {.fragment} +```{r} +flowFrame@parameters@.__classVersion__ +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Also mercifully short, both of these seem to be more involved in defining the S4 class object, and don't contain anything we need to retrieve today. +::: +::: + +--- + +### Description + +::: {.fragment} +::: {.callout-tip title="."} +At this point, we have explored both "exprs" and "parameter" slots for the flowFrame object we created. Let's tackle the final slot, named description. +::: +::: + +::: {.fragment} +![](images/17_Description.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When doing so, a very large list is opened within the Positron variables window. While we could scroll through it, it might be easier to retrieve certain number of rows via the console to make interpreting this more structured. +::: +::: + +--- + +![](images/18_List.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To retrieve the list itself, we would need to access the description slot of the flowFrame object. Since it is a slot, we will need to use the @ accessor. +::: +::: + + + + +::: {.fragment} +```{r} +DescriptionList <- flowFrame@description +``` +::: + +--- + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +DescriptionList +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The returned list is a little too large to reasonably explore. We can attempt to subset using the `head()` function as shown below +::: +::: + +::: {.fragment} +```{r} +head(DescriptionList, 5) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, it might be better to subset based on position index +::: +::: + +::: {.fragment} +```{r} +DescriptionList[1:10] +``` +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And just as we saw for exprs and parameters, there is also a Bioconductor helper `keyword()` function to access this same information directly from the flowFrame. +::: +::: + +::: {.fragment} +```{r} +DescriptionList_Alternate <- keyword(flowFrame) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we run the `class()` function, we can see that DescriptionList is an actual "list". +::: +::: + +::: {.fragment} +```{r} +class(DescriptionList) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is in contrast to the vectors we have previously generated. While these are also list like, they are what are known as as atomic list, which contain values that are all either characters, numerics or logicals. +::: +::: + +::: {.fragment} +```{r} +Fluorophores <- c("BV421", "FITC", "PE", "APC") +class(Fluorophores) +``` + +::: + +::: {.fragment} +```{r} +PanelAntibodyCounts <- c(5, 12, 19, 26, 34, 46, 51) +class(PanelAntibodyCounts) +``` + +::: + +::: {.fragment} +```{r} +SpecimenIndexToKeep <- c(TRUE, TRUE, FALSE, TRUE) +class(SpecimenIndexToKeep) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +A list on the other hand is not restricted to contain objects composed entirely of a certain atomic type. For example, I could include the three previous vectors into a list using the `list()` function. +::: +::: + +::: {.fragment} +```{r} +MyListofVectors <- list(Fluorophores, PanelAntibodyCounts, SpecimenIndexToKeep) +str(MyListofVectors) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can see that with the Description/Keyword list we retrieved from our flowFrame shares a somewhat similar format. +::: +::: + +::: {.fragment} +```{r} +str(DescriptionList[1:10]) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +But in this case, there are also names present ($BEGINANALYSIS, $BEGINDATA, etc). What if we had tried to provide names to our List of Vectors? Would the format match? +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When we assigned a name to each of the vectors (by providing an equal to = ), we get the same kind of structure format to what we see in Description. +::: +::: + +::: {.fragment} +```{r} +MyNamedListofVectors <- list(FluorophoresNamed=Fluorophores, + PanelAntibodyCountsNamed=PanelAntibodyCounts, + SpecimenIndexToKeepNamed=SpecimenIndexToKeep) + +str(MyNamedListofVectors) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We could then subsequently be able to isolate items from that list using the $ operator. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +MyNamedListofVectors$ +``` + +::: + +::: {.fragment} +![](images/20_ListAccess.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we could also access by list index position +::: +::: + +::: {.fragment} +```{r} +MyNamedListofVectors[1] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Remembering back to the original output from `read.FCS()` we remember that it mentioned 599 keywords being in the description slot, so now we know that this is what was being referenced. +::: +::: + +--- + +![](images/00_flowFrame.png) + +--- + +# Keyword Madness + +::: {.fragment} +::: {.callout-tip title="."} +Rather than go through the keywords individually (in which case we would be here through tomorrow), let's take a birds eye view of the contents of this list. +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Subset <- DescriptionList[1:18] +Subset +``` + +::: + +--- + +## Early Metadata + +::: {.fragment} +::: {.callout-tip title="."} +Within the initial portion, we are getting back metadata keywords related to where and how the particular file was acquired. Keywords of potential interest include: +::: +::: + +::: {.fragment} +:::{.callout-tip title="Start Time"} +What time was the .fcs file acquired +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$BTIM` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Cytometer"} +What type of cytometer was the .fcs file acquired on +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$CYT` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Cytometer Serial Number"} +Manufacturer Serial Number of the Cytometer +::: +::: + +::: {.fragment} +```{r} +DescriptionList$`$CYTSN` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="FCS File Acquisition Date"} +What was the date of acquisition +::: +::: + +::: {.fragment} +```{r} +DescriptionList$`$DATE` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Acquisition End Time"} +What time was acquisition stopped +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$ETIM` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="File Name"} +Name of the .fcs file +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$FIL` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Operator"} +Who acquired the .fcs file +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$OP` +``` + +::: + +--- + +## Detector Values + +::: {.fragment} +::: {.callout-tip title="."} +The next major stretch of keywords encode parameter values associated with the individual detectors for at the time of acquisition. +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[20:384] +Detectors +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Fortunately for all involved, there is a consistently repeating pattern for the keywords corresponding to each detector. We can see that here for $P7B, $P7E, $P7N, $P7R, $P7TYPE, $P7V +::: +::: + +--- + +![](images/21_DetectorIteration.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When referencing to the [Flow Cytometry Standard](https://web.archive.org/web/20150209122542/http://www.isac-net.org/images/stories/documents/Standards/fcs3.1_normativespecification_20090813.pdf) documentation, here are what the particular keyword letters mean: +::: +::: + +--- + +::: {.fragment} +:::{.callout-tip title="B"} +Number of bits reserved for parameter number n +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7B` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="E"} +Amplification type for parameter n. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7E` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="N"} +Short Name for parameter n. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7N` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="R"} +Range for parameter number n. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7R` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="TYPE"} +Detector type for parameter n. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7TYPE` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="V"} +Detector voltage for parameter n. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$P7V` +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +While not immediately obvious, understanding what these keywords encoded has proven useful for our core. In our case, we have built an automated [InstrumentQC dashboard](https://umgccfcss.github.io/InstrumentQC/Aurora3L.html) for all the instruments at our core. +::: +::: + +--- + +![](images/InstrumentQC.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By extracting out from our daily QC bead .fcs files the stored **N (Detector Name)** and **V (Gain/Voltage)** values for all the individual detectors, it allows us to plot Levey-Jennings Plots for our individual instruments, giving us usually around a months warning before an individual laser begins to fail. This helps with scheduling the Field-Service Engineer visit before it starts impacting the actual data. +::: +::: + +--- + +![](images/LeveyJennings.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +While most of the detectors keywords are similar (only changing there individual name and voltage) there are a couple exceptions. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For the FSC/SSC parameters, instead of Raw_Fluorescence value for Type, we see the corresponding Scatter value get return. This in term is what is used by various commercial softwares to show those axis as linear instead of biexponential when selected. +::: +::: + +--- + +![](images/22_FSC.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is similarly the case for the Time parameter, where in addition to Type being set to Time, the range also appears different to Raw/Scatters value. +::: +::: + +--- + +![](images/23_Time.png) + +--- + +## Middle Metadata + +::: {.fragment} +::: {.callout-tip title="."} +Once we are out of the detector keywords, we find the last of the $Metadata associated keywords. +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[385:398] +Detectors +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Among those of potential interest +::: +::: + +::: {.fragment} +:::{.callout-tip title="Proj"} +Often corresponding to the experiment file name +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$PROJ` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Spillover"} +Where the internal spillover matrix is stored (we will revisit during compensation) +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$SPILLOVER` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="TOT"} +Total events (in this case my downsampled 100 cells) +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$TOT` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Volume"} +Volume amount acquired during acquisition. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$`$VOL` +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Software"} +Software used and version +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$CREATOR +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice at this point, the keyword names including a "$" symbol have stopped, so tick marks are no longer required (except when there is a space in the name). The only $ remaining is being used as a selector for a particular item in the list. +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[390:398] +Detectors +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="FILENAME"} +Basically the full file.path to the .fcs file of interest. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$FILENAME +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="GROUPNAME"} +The Name assigned to the acquisition Group. +::: +::: + +::: {.fragment} + +```{r} +DescriptionList$GROUPNAME +``` + +::: + +--- + +## Laser Metadata + +::: {.fragment} +::: {.callout-tip title="."} +Next up, there is a small stretch of keywords containing the values associated with the individual lasers as far as delays and area scaling factors for a particular day (also useful when [plotted](https://umgccfcss.github.io/InstrumentQC/Aurora5L.html)). +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[399:410] +Detectors +``` + +::: + +--- + +## Display + +::: {.fragment} +::: {.callout-tip title="."} +Then there is a stretch matching whether a particular detector needs to be displayed as linear (in the case of time and scatter) or as log (for individual detectors). +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[412:472] +Detectors +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And a few final keywords with threshold, window scaling and other user selected settings. +::: +::: + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +Detectors <- DescriptionList[473:476] +Detectors +``` + +::: + +--- + +## flowCore Parameters + +::: {.fragment} +::: {.callout-tip title="."} +Depending on the arguments selected during `read.FCS()`, we might also encounter additional keywords that are added in by flowCore. For example, we do not see these keywords when "transformation" is set to FALSE. +::: +::: + +::: {.fragment} +```{r} +flowCoreCheck <- read.FCS(filename=firstfile, + transformation = FALSE, truncate_max_range = FALSE) + +flowCoreCheck +``` + +::: + +--- + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +NoChange <- keyword(flowCoreCheck) +Detectors <- NoChange [476:500] +Detectors +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +By contrast, if we had set "transformation" to TRUE: +::: +::: + +::: {.fragment} +```{r} +flowCoreCheck <- read.FCS(filename=firstfile, + transformation = TRUE, truncate_max_range = FALSE) + +flowCoreCheck +``` + +::: + +--- + +::: {.fragment} +```{r} +#| class-output: "scroll-output" +YesChange <- keyword(flowCoreCheck) +Detectors <- YesChange [476:500] +Detectors +``` + +::: +--- + +::: {.fragment} +::: {.callout-tip title="."} +For some flow cytometry R packages, you will notice when opening their exported .fcs outputs in commercial software that these flowCore keywords have ended up integrated. It is likely somewhere in the package code the author forgot to add set transformation to FALSE, which is why we are seeing these flowCore keywords after the fact. +::: +::: + +--- + +# Take Away + +::: {.fragment} +::: {.callout-tip title="."} +Today we broke open an .fcs file and explored how the underlying data is organized and stored once it is brought into R. In the process, we continued to build familiarity with some of the basic R knowledge, going from smaller simpler objects we encountered in week 2 to matrices and data.frames, to complex objects with multiple slots typical of what we encounter in the Bioconductor packages. We will build on these initial observations on the weeks to come. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In context of our continuing analogy, with each function being a tool, and an R package a toolbox, each tool in the toolbox works on different types of objects. A hammer needs nails, screwdrivers need screws, a paintbrush needs paint and a wall, etc. Object types help define these requirements, so when we use a function, knowing what type can help determine what we provide to it in order for it to work properly and not error out. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next week, we will dive into the world of [tidyverse](https://tidyverse.org/), working specifically with these intermediate object types matrices and data.frames. The basic premise is to think of all data as rows and columns, the reasoning behind this approach which can be found [here](https://vita.had.co.nz/papers/tidy-data.html). +::: +::: + +--- + +![](images/TakeAway.jpg) + +--- + +# Additional Resources + +[Data File Standard for Flow Cytometry, Version FCS 3.1](https://pmc.ncbi.nlm.nih.gov/articles/PMC2892967/) + +[R Programming - R Data Types: Vectors and Lists](https://youtu.be/p01ckVx-678?si=BQp6SFTWfZzz2-wI) + +[Base Types vs. Object-Oriented Objects](https://adv-r.hadley.nz/base-types.html) + +--- + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Today's walkthrough focused on a raw spectral flow cytometry file. Within a subfolder in data you will also find an unmixed .fcs file (2025_07_26...). Using what learned to day, investigate it, and see if you can catalog the main differences that occured to the keyword, parameters and exprs. Did any keywords get added, changed, deleted entirely? etc. +::: + +--- + +:::{.callout-tip title="Problem 2"} +Today's files were for spectral .fcs files from a Cytek Aurora within a subfolder in data you will also find a conventional flow cytometry file (2025-10_22...). Similarly, explore and see if you find any major differences (beyond the different detector or fluorophore names which will vary based on antibody panel used, etc) +::: + +--- + +:::{.callout-tip title="Problem 3"} +If you have access to commercial software, take one of the .fcs files and try to see if you can see similar internal information from within the software. For those without commercial access, try the equivalent process using [Floreada.io](/course/00_Floreada/index.qmd). +::: + +--- + +![](images/TakeAway.jpg) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ::: \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/BonusContent.qmd b/course/04_IntroToTidyverse/homeworks/claude-chew/BonusContent.qmd new file mode 100644 index 0000000..2459223 --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/BonusContent.qmd @@ -0,0 +1,88 @@ +--- +title: "Bonus Content" +author: "David Rach" +date: 02-23-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +```{r} +thefilepath <- file.path("data", "Dataset.csv") + +thefilepath +``` + +```{r} +Data <- read.csv(file=thefilepath, check.names=FALSE) +colnames(Data) +``` + +## Pull + +## Case-When + +Case-when is an useful function, but may be a bit much to try to teach in the main segment. Basically, when the condition on the left side of the ~ is fulfilled, it will execute what is being specified on the right hand side. + +In turn, we can combine these together by adding a ",". I tend to use this mutate str_detect case_when combination when encountering messy data out in the while where I need to selectively change particular cell values in a consistent reproducible manner + +# Quasiquosure + +```{r} +library(dplyr) +DateColumn <- select(Data, Date) +DateColumn +``` + + +## Selecting Columns (Base R) + +As we saw [last week](/course/03_InsideFCSFile/index.qmd), there are multiple ways to select values from particular columns in base R. If we had wanted to retrieve the "Date" column, why not first identify its index position, and use [,] to extract the underlying data? + +```{r} +colnames(Data) +``` + +```{r} +colnames(Data)[4] +``` + +```{r} +DataColumn <- Data[,4] # Column specified after the , +DataColumn +``` + +However, looking at the output, we see this looks like the values, not a column. Our suspicions are confirmed when running DataColumn + +```{r} +str(DataColumn) +``` + +This is similarly the case when we use the $ accessor. + +```{r} +DataColumn <- Data$Date +str(DataColumn) +``` + +```{r} +head(DataColumn, 3) +``` + +By contrast, when selecting two columns, the structure is maintained. + +```{r} +TwoColumns <- Data[,4:5] +``` + +Why is the data.frame column structure lost in base R when isolating a single data.frame column? And who thought to make it that convoluted? If we were an R course in early 2010s, we might go into an explanation, but fortunately, we don't need to understand why, we have the `dplyr` R package to rescue us. + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Classwork.qmd b/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Classwork.qmd new file mode 100644 index 0000000..712b8ec --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Classwork.qmd @@ -0,0 +1,101 @@ +# Week 4 Classwork + +# read.csv +```{r} +library(tidyverse) +thefilepath <- file.path("data","Dataset.csv") +thefilepath + +Data <- read.csv(file=thefilepath, check.names=FALSE) +colnames(Data) + +Data_Alternative <- read.csv(thefilepath, check.names=TRUE) +colnames(Data_Alternative) + +head(Data,3) +view(Data) +class(Data) + +library(dplyr) +glimpse(Data) + +dim(Data) + +is.character(Data$bid) +is.numeric(Data$bid) +is.character(Data$Tcells_count) +is.numeric(Data$`CD8-`) + +DateColumn <- select(Data,"Date") +DateColumn + +Data |> select("Date") +Data |> select("Date") |> nrow() +Data |> select(Date) |> head(5) + +Subset <- Data |> select(bid, timepoint, Condition, Tcells, `CD8+`, `CD4+`, timepoint, Condition) +head(Subset, 5) + +Data |> relocate(Tcells, .after=bid) |> head(5) +Data |> relocate(Tcells, Monocytes, .after=bid) |> head(5) +Data |> relocate(Tcells, .before=bid) |> head(5) +Data |> relocate(Tcells, .before=1) |> head(5) + +colnames(Subset) +colnames(Subset)[3] +colnames(Subset)[3] <- "CD8Positive" +colnames(Subset) + +Renamed <- Subset |> rename(CD4_Positive = `CD4+`) +colnames (Renamed) + +Renamed <- Subset |> rename(specimen = `bid`, CD4_Positive=`CD4+`) +colnames(Renamed) + +Data |> pull(Date) |> head(10) +Data |> pull(Date) |> unique() + +Data |> pull(Condition) |> unique() + +Data |> pull(Condition) |> unique() + +PPDOnly <- Data |> filter(Condition == "PPD") +head(PPDOnly,5) + +Data |> filter(Condition %in% "PPD") |> head(10) + +Data |> filter(Condition %in% c("PPD", "SEB")) |> head(10) + +TheseConditions <- c("PPD", "SEB") +Data |> filter(Condition %in% TheseConditions) |> head(10) + +IsThisASpectralInstrument <- TRUE +!IsThisASpectralInstrument + +Subset <- Data |> filter(!Condition %in% "SEB") +Subset |> pull(Condition) |> unique() + +Subset <- Data |> select(!timepoint) +Subset[1:3] + +TidyData <- Data |> filter(Condition %in% "Ctrl") |> filter(timepoint %in% "0") |> select(bid, timepoint, Condition, Date, Tcells_count, CD45_count) |> rename(specimen=bid, condition=Condition) |> relocate(Date, .after=specimen) +TidyData + +TidyData <- TidyData |> mutate(Tcells_ProportionCD45 = Tcells_count / CD45_count) +TidyData + +TidyData <- TidyData |> mutate(Tcells_rounded = round(Tcells_ProportionCD45,2)) +TidyData + +# arrange +TidyData <- TidyData |> arrange(desc(Tcells_rounded)) +TidyData + +TidyData |> filter(Tcells_rounded >0.3) +TidyData |> filter(Tcells_rounded >0.3) |> pull(specimen) + +NewName <- paste0("MyNewDataset", ".csv") +StorageLocation <- file.path("data", NewName) +StorageLocation +NewName +``` \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Homework.qmd b/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Homework.qmd new file mode 100644 index 0000000..4b5094d --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/Week4_Homework.qmd @@ -0,0 +1,70 @@ +# Problem 1 +Taking a dataset (either todays or one of your own), work through the column-operating functions (select(), rename(), and relocate()). Once this is done, filter() by conditions from two separate columns, arrange in an order that makes sense, and export this “tidy” data as a .csv file. + +```{r} +library(tidyverse) +thefilepath <- file.path("data","Dataset.csv") +thefilepath + +Data <- read.csv(file=thefilepath, check.names=FALSE) +colnames(Data) + +Data |> select(ptype) +Data + +Data |> relocate(ptype, .before=bid) |> head(5) +Renamed <- Subset |> rename(phenotype = `ptype`) +colnames (Renamed) + +Renamed <- Subset |> rename(specimen = `bid`, CD4_Positive=`CD4+`) +colnames(Renamed) + +Renamed |> filter(phenotype %in% "HEU-hi") |> head(10) + +TidyData <- Renamed |> filter(phenotype %in% "HEU-hi") |> filter(infant_sex %in% "Male") +TidyData + +# arrange +TidyData <- TidyData |> arrange(desc(CD45_count)) +TidyData + +tidy <- paste0("tidy", ".csv") +StorageLocation <- file.path("data", tidy) +StorageLocation +tidy +write.csv(TidyData, StorageLocation) +``` + +# Problem 2 +We used the mutate() function to create new columns, but it can also be used to modify existing ones. Various numeric columns are showing way to many significant digits. As was shown, use round() to round all these proportion columns, but use mutate to overwrite the existing column. Export this as it’s own .csv file. + +```{r} +colnames(Data) +Rounded <- Data |> mutate(CD45 = round(CD45,2)) |> mutate(NotMonocytes = round(NotMonocytes,2)) |> mutate(nonDebris = round(nonDebris,2)) |> mutate(lymphocytes = round(lymphocytes,2)) |> mutate(live = round(live,2)) |> mutate(`Dump+` = round(`Dump+`,2)) |> mutate(`Dump-` = round(`Dump-`,2)) |> mutate(Tcells = round(Tcells,2)) |> mutate(`Vd2+` = round(`Vd2+`,2)) |> mutate(`Vd2-`= round(`Vd2-`,2)) |> mutate(`Va7.2+` = round(`Va7.2+`,2)) |> mutate(`Va7.2-` = round(`Va7.2-`,2)) |> mutate(`CD4+`= round(`CD4+`,2)) |> mutate(`CD4-` = round(`CD4-`,2)) |> mutate(`CD8+`= round(`CD8+`,2)) |> mutate(`CD8-` = round(`CD8-`,2)) |> mutate(Monocytes = round(Monocytes,2)) |> mutate(Debris = round(Debris, 2)) + +Rounded + +rounded <- paste0("rounded", ".csv") +StorageLocation <- file.path("data", rounded) +StorageLocation +rounded +write.csv(Rounded, StorageLocation) +``` + +# Problem 3 +We can also use mutate() to combine columns. For our dataset, “bid”, “timepoint”, “Condition” are separate columns that originally were all part of the filename for the individual .fcs file. Try to figure out a way to combine them back together using paste0(), and save the new column as “filename”. Once this is done, pull() the contents of this column, and using try to determine whether there were any duplicates (think innovative ways of using !, length() and unique()) + +```{r} +combined <- Data |> mutate(filename = paste(bid, timepoint, Condition)) +combined + +unique_filenames <- combined |> + dplyr::pull(filename) |> + unique() +unique_filenames + +length(unique(unique_filenames)) < length(unique_filenames) +any(duplicated(unique_filenames)) +unique_filenames[duplicated(unique_filenames)] + +``` \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/data/Dataset.csv b/course/04_IntroToTidyverse/homeworks/claude-chew/data/Dataset.csv new file mode 100644 index 0000000..a7ac736 --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/data/Dataset.csv @@ -0,0 +1,197 @@ +bid,timepoint,Condition,Date,infant_sex,ptype,root,singletsFSC,singletsSSC,singletsSSCB,CD45,NotMonocytes,nonDebris,lymphocytes,live,Dump+,Dump-,Tcells,Vd2+,Vd2-,Va7.2+,Va7.2-,CD4+,CD4-,CD8+,CD8-,Tcells_count,lymphocytes_count,Monocytes,Debris,CD45_count +INF0052,0,Ctrl,2025-07-26,Male,HEU-hi,2098368,1894070,1666179,1537396,0.595294250798103,0.882034914658278,0.862764872929831,0.642013848293767,0.902058127245466,0.210909963527936,0.69114816371753,0.280426432119924,0.00812036098585309,0.991879639014147,0.0144807035218576,0.977398935492289,0.63411644039303,0.343282495099259,0.273482590989919,0.0697999041093396,164771,587573,0.117965085341722,0.137235127070169,915203 +INF0100,0,Ctrl,2025-07-26,Male,HEU-lo,2020184,1791890,1697083,1579098,0.91067622148847,0.905225628925897,0.860266041374169,0.214584780608701,0.890898072803751,0.06252774780205,0.828370325001701,0.6748297864756,0.00726562012283844,0.992734379877162,0.0157749914762223,0.976959388400939,0.611911199043416,0.365048189357523,0.335769613092523,0.0292785762650006,208241,308583,0.0947743710741026,0.139733958625831,1438047 +INF0100,4,Ctrl,2025-07-26,Male,HEU-lo,1155040,1033320,875465,845446,0.970576476794497,0.984540014867714,0.957879279037742,0.740311003326956,0.875766489924721,0.200238033703334,0.675528456221388,0.611912879006119,0.00465131294001178,0.995348687059988,0.0157940186644356,0.979554668395553,0.663962143854429,0.315592524541123,0.286210430885364,0.0293820936557598,371723,607477,0.0154599851322861,0.0421207209622579,820570 +INF0100,9,Ctrl,2025-07-26,Male,HEU-lo,358624,328624,289327,276289,0.981957298336163,0.985507032701324,0.941261463155722,0.651158847639548,0.915324178374523,0.21469246357451,0.700631714800014,0.631443094723257,0.0113489672977625,0.988651032702238,0.0170234509466437,0.971627581755594,0.437894434882387,0.533733146873207,0.486123063683305,0.0476100831899025,111552,176662,0.014492967298676,0.058738536844278,271304 +INF0179,0,Ctrl,2025-07-26,Male,HU,1362216,1206309,1032946,982736,0.957259121473112,0.955627154569894,0.840783729283442,0.705478600197931,0.895214015462574,0.338318765284397,0.556895250178177,0.439643676723417,0.00475363034097958,0.99524636965902,0.0133218176895369,0.981924551969484,0.739256349883644,0.24266820208584,0.195063353177255,0.0476048489085843,291777,663667,0.0443728454301061,0.159216270716558,940733 +INF0179,4,Ctrl,2025-07-26,Male,HU,1044808,917398,735579,685592,0.985800592772378,0.962289360027343,0.949924318309938,0.755677606357558,0.967305621365496,0.369473107121179,0.597832514244317,0.532316488164001,0.00516055467686762,0.994839445323132,0.0124618383786368,0.982377606944495,0.587626439106926,0.394751167837569,0.357137602530621,0.0376135653069482,271870,510730,0.0377106399726569,0.0500756816900616,675857 +INF0179,9,Ctrl,2025-07-26,Male,HU,1434840,1265022,988445,940454,0.98001603480872,0.980521016426882,0.965775882646529,0.7879673632359,0.929742040488104,0.238631137450808,0.691110903037296,0.671869277013871,0.00263148726167518,0.997368512738325,0.0135632264001295,0.983805286338195,0.699414063700847,0.284391222637349,0.258078399465505,0.0263128231718439,487937,726238,0.0194789835731181,0.0342241173534709,921660 +INF0186,4,Ctrl,2025-07-26,Female,HEU-hi,972056,875707,767323,718000,0.977238161559889,0.949066281673239,0.9189703801145,0.642831183897545,0.875651539639993,0.325167887160318,0.550483652479675,0.489159666287549,0.00930047046239474,0.990699529537605,0.0387700898320295,0.951929439705576,0.572472964275678,0.379456475429897,0.355552634680058,0.0239038407498391,220634,451047,0.0509337183267607,0.0810296198854996,701657 +INF0186,9,Ctrl,2025-07-26,Female,HEU-hi,1521928,1359574,1175755,1097478,0.972123359192622,0.95816977290877,0.918676257212593,0.666392972431867,0.874952880877231,0.228757011606776,0.646195869270455,0.584933976966485,0.0179408320448605,0.982059167955139,0.0367713716164062,0.945287796338733,0.511920878550113,0.43336691778862,0.413879918339277,0.0194869994493432,415867,710964,0.0418302270912302,0.0813237427874071,1066884 +INF0052,0,PPD,2025-07-26,Male,HEU-hi,2363512,2136616,1875394,1732620,0.587383846429107,0.86198368302262,0.84296849897761,0.640804431111718,0.900925393503078,0.207432282202851,0.693493111300228,0.28356755679248,0.00740820851132861,0.992591791488671,0.015070567241659,0.977521224247012,0.634034499540367,0.343486724706646,0.274411939652842,0.0690747850538041,184930,652155,0.13801631697738,0.15703150102239,1017713 +INF0100,0,PPD,2025-07-26,Male,HEU-lo,2049112,1821676,1717636,1597085,0.906308054987681,0.925196086085125,0.877188934202263,0.217428431083332,0.892967332555915,0.0618142648792407,0.831153067676675,0.67357975578059,0.00713723011316732,0.992862769886833,0.0167180062928387,0.976144763593994,0.61457070480737,0.361574058786624,0.331227858312066,0.0303462004745574,211987,314717,0.0748039139148752,0.122811065797737,1447451 +INF0100,4,PPD,2025-07-26,Male,HEU-lo,1063496,946587,796056,767297,0.970989069421619,0.984871892268438,0.955604889421599,0.731350255088002,0.878230739443147,0.207272019864815,0.670958719578332,0.598987305531646,0.00525464338895391,0.994745356611046,0.0160978987554308,0.978647457855615,0.655948011201735,0.32269944665388,0.291208353504219,0.0314910931496608,326378,544883,0.0151281077315624,0.0443951105784008,745037 +INF0100,9,PPD,2025-07-26,Male,HEU-lo,788368,714198,626387,600011,0.982280324860711,0.98421389292798,0.812304137066302,0.622322817745458,0.95666386756238,0.231645873320537,0.725017994241843,0.648940520851509,0.0119359216203612,0.988064078379639,0.0185529848206671,0.969511093558972,0.430688888795526,0.538822204763445,0.490855848853673,0.0479663559097727,238021,366784,0.0157861070720199,0.187695862933698,589379 +INF0179,0,PPD,2025-07-26,Male,HU,1380336,1242311,1047081,1000877,0.947027456920281,0.957568538747365,0.913443785883539,0.699650158568056,0.885689771385574,0.331861109309995,0.55382866207558,0.444153752663348,0.00438297193336253,0.995617028066637,0.0129723747152426,0.982644653351395,0.749919368254518,0.232725285096877,0.185089747376498,0.0476355377203793,294549,663169,0.0424314612526349,0.0865562141164605,947858 +INF0179,4,PPD,2025-07-26,Male,HU,1240984,1089933,868877,814909,0.985594710575046,0.954141713460413,0.940082423397288,0.730307406900158,0.960259887718413,0.343572109294685,0.616687778423727,0.565465484408271,0.00432042932947419,0.995679570670526,0.012668837433671,0.983010733236855,0.631877110467921,0.351133622768934,0.317746020260492,0.0333876025084419,331680,586561,0.0458582865395869,0.0599175766027118,803170 +INF0179,9,PPD,2025-07-26,Male,HU,1705960,1492142,1163543,1107878,0.982091890984386,0.981690896825295,0.968165633920874,0.793325233126049,0.934456560020761,0.24759143063691,0.686865129383851,0.668731927040854,0.00273375511929428,0.997266244880706,0.0133032354632831,0.983963009417423,0.701636095269114,0.282326914148309,0.255933530597961,0.0263933835503475,577228,863168,0.0183091031747052,0.0318343660791259,1088038 +INF0186,4,PPD,2025-07-26,Female,HEU-hi,848584,759606,648405,607514,0.98247777005962,0.953948018744482,0.925017047291784,0.672087174907727,0.862222920218972,0.326410701287305,0.535812218931666,0.475772034261669,0.00948363941211915,0.990516360587881,0.0435251892798198,0.946991171308061,0.530910900945744,0.416080270362317,0.391218464279165,0.0248618060831521,190855,401148,0.0460519812555183,0.0749829527082158,596869 +INF0186,9,PPD,2025-07-26,Female,HEU-hi,1425416,1259825,1089955,1014266,0.977148992473375,0.955257297780522,0.913761528984783,0.633243835821001,0.879303888935805,0.238632506959039,0.640671381976766,0.581861724248368,0.0182240393014894,0.981775960698511,0.0373818723523113,0.944394088346199,0.503380552444431,0.441013535901768,0.42133814561158,0.019675390290188,365177,627601,0.0447427022194777,0.0862384710152166,991089 +INF0052,0,SEB,2025-07-26,Male,HEU-hi,2523776,2282292,2041563,1889418,0.578359050247219,0.887807226093147,0.867014958426446,0.67185626879412,0.911565163264,0.233447156619843,0.678118006644156,0.274166109354803,0.00922563305131479,0.990774366948685,0.00842081207430187,0.982353554874383,0.608325425884434,0.37402812898995,0.281175634790126,0.0928524941998241,201287,734179,0.112192773906853,0.132985041573554,1092762 +INF0100,0,SEB,2025-07-26,Male,HEU-lo,1900240,1685653,1598641,1488015,0.911195787676871,0.901785786721913,0.85768873633445,0.217299850354716,0.890574990411735,0.0878318982048732,0.802743092206862,0.650759763908075,0.00764600957576643,0.992353990424234,0.008955114898766,0.983398875525468,0.611049683415565,0.372349192109902,0.335548207412353,0.0368009846975497,191734,294631,0.0982142132780872,0.14231126366555,1355873 +INF0100,4,SEB,2025-07-26,Male,HEU-lo,1009776,900919,761137,732910,0.969596539820715,0.983067066126111,0.953615609876912,0.724198489502932,0.875529258600756,0.21414206184966,0.661387196751095,0.594879866313018,0.00466770756436471,0.995332292435635,0.00950526872799253,0.985827023707643,0.639848307670197,0.345978716037446,0.310218000561823,0.0357607154756227,306146,514635,0.0169329338738888,0.0463843901230885,710627 +INF0179,0,SEB,2025-07-26,Male,HU,783096,710001,604070,579147,0.966198564440462,0.97132088689371,0.892646330849883,0.779109353415384,0.925393435741696,0.34958379877376,0.575809636967936,0.480378102012308,0.00410640360217544,0.995893596397825,0.00684718926223207,0.989046407135592,0.725620616056038,0.263425791079554,0.185747914567706,0.0776778765118489,209429,435967,0.0286791131062903,0.107353669150117,559571 +INF0179,4,SEB,2025-07-26,Male,HU,985280,860127,686367,640888,0.984159478723271,0.951545496055402,0.933428565992745,0.757827363587935,0.925535943295766,0.332859124373155,0.592676818922611,0.519413626673417,0.00457156206449326,0.995428437935507,0.00662171632953914,0.988806721605968,0.56142407179165,0.427382649814318,0.377611026527143,0.0497716232871747,248274,477989,0.048454503944598,0.0665714340072551,630736 +INF0179,9,SEB,2025-07-26,Male,HU,1111728,981610,783127,748455,0.984322370750413,0.984891159611305,0.974006442058798,0.818738708412004,0.935493764734359,0.263124562735625,0.672369201998733,0.651935899943964,0.00303888758913223,0.996961112410868,0.00824949902857317,0.988711613382295,0.696706303593771,0.292005309788524,0.256265957338596,0.0357393524499283,393236,603182,0.0151088403886953,0.0259935579412016,736721 +INF0186,4,SEB,2025-07-26,Female,HEU-hi,492984,443892,386199,365672,0.980110590912074,0.977871032006228,0.943936785537906,0.6789695283748,0.860509077758874,0.334175769082197,0.526333308676677,0.470724330366316,0.00879115123049927,0.991208848769501,0.0126410992867557,0.978567749482745,0.504692397007342,0.473875352475403,0.445432879080203,0.0284424733952002,114547,243342,0.0221289679937723,0.0560632144620939,358399 +INF0186,9,SEB,2025-07-26,Female,HEU-hi,1226128,1088491,957607,891839,0.9712649928967,0.956045402280273,0.910587708320827,0.60486116562689,0.868179059354351,0.229586325099535,0.638592734254816,0.574161446583374,0.0188780852655198,0.98112191473448,0.00923128064489321,0.971890634089587,0.483639990027425,0.488250644062162,0.460942408376963,0.027308235685199,300825,523938,0.0439545977197268,0.0894122916791732,866212 +INF0134,0,Ctrl,2025-07-29,Female,HEU-lo,1205504,1088093,965389,876164,0.787154003131834,0.798904123095483,0.783886926614816,0.577284116019696,0.882294876914846,0.15782427745084,0.724470599464006,0.321159193146112,0.00979932116434392,0.990200678835656,0.0251826130480347,0.965018065787621,0.698582891464502,0.26643517432312,0.225141945474168,0.0412932288489512,127866,398139,0.201095876904517,0.216113073385184,689676 +INF0134,4,Ctrl,2025-07-29,Female,HEU-lo,1277824,1143114,940824,904464,0.981203231969432,0.979719717892464,0.962388291117489,0.775382184947429,0.939878481027374,0.321119916061518,0.618758564965856,0.511173147823863,0.00979673063255153,0.990203269367449,0.0261066098081023,0.964096659559346,0.636952380952381,0.327144278606965,0.275565031982942,0.0515792466240227,351750,688123,0.0202802821075357,0.0376117088825112,887463 +INF0134,9,Ctrl,2025-07-29,Female,HEU-lo,424520,386914,358089,331672,0.95725897875009,0.970383878852017,0.900017638017487,0.427759719807494,0.822040762230142,0.119105822754985,0.702934939475157,0.535733219450417,0.029535864978903,0.970464135021097,0.0286699927156778,0.941794142305419,0.461001388144422,0.480792754160997,0.420387855797908,0.0604048983630891,72759,135812,0.029616121147983,0.0999823619825132,317496 +INF0148,0,Ctrl,2025-07-29,Female,HU,2034128,1833204,1602246,1509990,0.671517692170147,0.91727885520989,0.899144464661706,0.647882365123744,0.876630088150722,0.220344839658844,0.656285248491878,0.356705224045313,0.00385772505174216,0.996142274948258,0.0201335694625216,0.976008705485736,0.668798941686048,0.307209763799689,0.267719290758956,0.0394904730407323,234335,656943,0.0827211447901103,0.100855535338294,1013985 +INF0148,9,Ctrl,2025-07-29,Female,HU,872400,793908,670148,623296,0.982887745148373,0.981657770595629,0.948915332256011,0.610627948353819,0.969135686962194,0.210789411075974,0.75834627588622,0.728201043067291,0.0133988223719954,0.986601177628005,0.0208287446955347,0.96577243293247,0.550636535835426,0.415135897097044,0.362616184309061,0.0525197127879829,272412,374089,0.0183422294043714,0.051084667743989,612630 +INF0191,0,Ctrl,2025-07-29,Female,HEU-hi,1997680,1808121,1593734,1482293,0.482659636117826,0.866839147213684,0.851001407519537,0.578498916056206,0.822556133013436,0.201008497570569,0.621547635442867,0.134772387365512,0.035317318035138,0.964682681964862,0.0205091430620294,0.944173538902833,0.455557547508067,0.488615991394765,0.379221943348871,0.109394048045895,55780,413883,0.133160852786316,0.148998592480463,715443 +INF0191,4,Ctrl,2025-07-29,Female,HEU-hi,644496,572957,458792,438631,0.974322380315117,0.97583347372756,0.953489732502199,0.793023810860897,0.964819880028208,0.240123571536058,0.72469630849215,0.672588540421878,0.00767715585503775,0.992322844144962,0.0165168524538384,0.975805991691124,0.665047883517804,0.310758108173319,0.223865864732901,0.0868922434404187,227949,338913,0.0241665262724396,0.0465102674978005,427368 +INF0191,9,Ctrl,2025-07-29,Female,HEU-hi,1504536,1353339,1109880,1047290,0.954451011658662,0.972429613430347,0.953109634278957,0.693557439222399,0.937200604092772,0.393165154751894,0.544035449340878,0.415256083119011,0.0211785956197787,0.978821404380221,0.0144085311843271,0.964412873195894,0.570575056011949,0.393837817183945,0.260659638397277,0.133178178786668,287885,693271,0.0275703865696533,0.0468903657210428,999587 +INF0134,0,PPD,2025-07-29,Female,HEU-lo,1245024,1126248,993895,896183,0.791566008281791,0.804229843188777,0.789978121986839,0.592486763238172,0.900348082216877,0.154857329117327,0.74549075309955,0.331456116182849,0.00945360055128058,0.990546399448719,0.0258771677960262,0.964669231652693,0.69642241874354,0.268246812909154,0.226039393591363,0.0422074193177903,139312,420303,0.195770156811223,0.210021878013161,709388 +INF0134,4,PPD,2025-07-29,Female,HEU-lo,1340280,1201488,986763,947027,0.983254965275541,0.983444466042147,0.964371666152975,0.763760391507879,0.947150550485805,0.320176042970233,0.626974507515572,0.513328365134493,0.010466371201455,0.989533628798545,0.0256112459391795,0.963922382859365,0.628647890564653,0.335274492294713,0.281901751425738,0.0533727408689745,365074,711190,0.016555533957853,0.0356283338470246,931169 +INF0134,9,PPD,2025-07-29,Female,HEU-lo,929672,828324,752940,697560,0.958546935030678,0.966002835589641,0.899239356069897,0.431271349178337,0.776881543311128,0.129113248048494,0.647768295262634,0.490593583870554,0.0258639579843219,0.974136042015678,0.0275392129835797,0.946596829032098,0.444189975330633,0.502406853701465,0.440365870036969,0.0620409836644966,141471,288367,0.0339971644103588,0.100760643930103,668644 +INF0148,0,PPD,2025-07-29,Female,HU,1862952,1676887,1450059,1372237,0.674659697996775,0.911606590242095,0.896064238982148,0.658815739587575,0.888040699952617,0.226900924208963,0.661139775743655,0.360931718058063,0.00422000345231714,0.995779996547683,0.0193193484205649,0.976460648127118,0.664716410316977,0.311744237810141,0.271842719699103,0.0399015181110374,220142,609927,0.0883934097579049,0.103935761017852,925793 +INF0148,4,PPD,2025-07-29,Female,HU,632312,562703,496868,467363,0.972633691584486,0.986906393472556,0.950157620448201,0.512846121525036,0.914050770827793,0.240886902361813,0.67316386846598,0.639881437505898,0.00312388971194519,0.996876110288055,0.0167054359703163,0.980170674317738,0.619850777285434,0.360319897032305,0.305376978407621,0.0549429186246841,149173,233126,0.0130936065274444,0.0498423795517992,454573 +INF0148,9,PPD,2025-07-29,Female,HU,1110656,997595,827243,774214,0.980991043819926,0.975244141846512,0.945795704262163,0.654739913390046,0.956100572522538,0.196441391348414,0.759659181174124,0.730733420073079,0.012606845839273,0.987393154160727,0.0212756003456494,0.966117553815078,0.556118489490167,0.40999906432491,0.358245223929065,0.0517538403958456,363374,497273,0.0247558581534885,0.054204295737837,759497 +INF0191,0,PPD,2025-07-29,Female,HEU-hi,1968064,1782256,1568308,1456260,0.489216898081387,0.876586653790494,0.861205428766737,0.584636741729328,0.802235715263222,0.199096782557964,0.603138932705259,0.12735317914773,0.0365357062061685,0.963464293793832,0.0206055350275243,0.942858758766307,0.450814418218837,0.49204434054747,0.378968403589473,0.113075936957997,53044,416511,0.123413346209506,0.138794571233263,712427 +INF0191,4,PPD,2025-07-29,Female,HEU-hi,1066672,941050,756678,723688,0.979242435966881,0.966806647983676,0.947546516976968,0.794993692374123,0.960648579568146,0.289526700213886,0.67112187935426,0.608381479805107,0.00961333671769467,0.990386663282305,0.0165308545804121,0.973855808701893,0.631869013546198,0.341986795155695,0.243043824561711,0.0989429705939846,342753,563385,0.0331933520163237,0.052453483023032,708666 +INF0191,9,PPD,2025-07-29,Female,HEU-hi,2415400,2151222,1768089,1652532,0.93912916663641,0.928039145818043,0.910939268954168,0.649623922558912,0.888403635072378,0.410601104170097,0.477802530902281,0.346151175685246,0.0267177103690162,0.973282289630984,0.0146425890160524,0.958639700614931,0.53798476712266,0.420654933492272,0.276607389492868,0.144047543999404,348982,1008178,0.0719608541819566,0.0890607310458322,1551941 +INF0134,0,SEB,2025-07-29,Female,HEU-lo,1193160,1079791,959139,869331,0.782985997278367,0.805832160476234,0.791506653699128,0.566516423427368,0.876204899731078,0.163671867909018,0.71253303182206,0.346036051689129,0.00822116969933151,0.991778830300668,0.0153107107527204,0.976468119547948,0.632348091969184,0.344120027578764,0.261855870979346,0.0822641565994185,133436,385613,0.194167839523766,0.208493346300872,680674 +INF0134,4,SEB,2025-07-29,Female,HEU-lo,1291352,1157622,964426,923312,0.982650501672241,0.977873740897373,0.956105690223555,0.740553492642399,0.941799288285888,0.339208720358268,0.60259056792762,0.501288140032951,0.00984813621721123,0.990151863782789,0.0180811424669329,0.972070721315856,0.600050472811484,0.372020248504372,0.304793432596529,0.0672268159078426,336815,671899,0.0221262591026272,0.0438943097764449,907293 +INF0148,0,SEB,2025-07-29,Female,HU,2042880,1841683,1602125,1513482,0.68014684020028,0.901883639825528,0.887045726109638,0.655521231020313,0.869403233909367,0.222301259508556,0.647101974400811,0.382685202886244,0.00371760168221476,0.996282398317785,0.0109359449485151,0.98534645336927,0.659413470884596,0.325932982484675,0.255453450592686,0.0704795318919882,258231,674787,0.0981163601744722,0.112954273890362,1029390 +INF0191,0,SEB,2025-07-29,Female,HEU-hi,1956304,1772838,1558215,1448120,0.500612518299588,0.874513585131051,0.858720706479232,0.584808268742405,0.813640598648442,0.205064216721114,0.608576381927327,0.153905485251973,0.0330426519946666,0.966957348005333,0.0149274318380358,0.952029916167298,0.46397645940934,0.488053456757958,0.365047740195252,0.123005716562706,65249,423955,0.125486414868949,0.141279293520768,724947 +INF0191,9,SEB,2025-07-29,Female,HEU-hi,1814944,1620273,1311159,1239312,0.955994132228204,0.953430820197928,0.93669852925661,0.694926040809436,0.916094499053236,0.411346105029447,0.504748394023789,0.378588927175097,0.0235030670122937,0.976496932987706,0.0090374201165208,0.967459512871185,0.549190899058081,0.418268613813105,0.271844442163078,0.146424171650027,311704,823331,0.0465691798020721,0.0633014707433901,1184775 +INF0124,0,Ctrl,2025-07-31,Male,HEU-hi,1229248,1096279,962417,891568,0.771360120596522,0.857697900308265,0.851096376432269,0.620287326237422,0.848707405809876,0.216735742550119,0.631971663259757,0.164790521913621,0.0142253581233908,0.985774641876609,0.00988662389575658,0.975888017980853,0.672020143107103,0.30386787487375,0.264805041466919,0.039062833406831,70297,426584,0.142302099691735,0.148903623567731,687720 +INF0124,4,Ctrl,2025-07-31,Male,HEU-hi,1105296,993220,820093,766344,0.899851763698809,0.947894129316295,0.938007181016131,0.699090481963352,0.91153726482607,0.258244311228194,0.653292953597876,0.479005994731274,0.00947930920995652,0.990520690790043,0.00774280715733315,0.98277788363271,0.509990299838908,0.472787583793802,0.423485648958099,0.0493019348357035,230924,482090,0.0521058706837046,0.0619928189838688,689596 +INF0124,9,Ctrl,2025-07-31,Male,HEU-hi,1017128,915840,757350,701114,0.745743202959861,0.954792091819658,0.946617678841582,0.744550550730514,0.902542840922811,0.341029415164569,0.561513425758241,0.534849430628659,0.00372698848763994,0.99627301151236,0.0102107957792816,0.986062215733079,0.662625893924913,0.323436321808166,0.290926031765853,0.0325102900423128,208211,389289,0.045207908180342,0.053382321158418,522851 +INF0149,0,Ctrl,2025-07-31,Female,HU,1327920,1192637,1046943,958252,0.895218585507779,0.886543606362455,0.868127692065583,0.541476607079368,0.836291692411029,0.157884879107347,0.678406813303682,0.232291287677367,0.017191844300278,0.982808155699722,0.0213438368860056,0.961464318813716,0.62177015755329,0.339694161260426,0.299629286376274,0.040064874884152,107900,464503,0.113456393637545,0.131872307934417,857845 +INF0149,4,Ctrl,2025-07-31,Female,HU,1026960,910155,731344,694429,0.945859115906738,0.979643196433791,0.947015370749294,0.669381211634025,0.91294172233329,0.292650641047511,0.62029108128578,0.545926385865795,0.00758244871431666,0.992417551285683,0.0194019031113037,0.97301564817438,0.672871498325195,0.300144149849184,0.263023480593931,0.0371206692552536,240028,439671,0.0203568035662087,0.0529846292507065,656832 +INF0149,9,Ctrl,2025-07-31,Female,HU,757368,665858,536020,502656,0.935176343264579,0.969391922939465,0.928508824180126,0.660841317925765,0.898426811484566,0.184607411079599,0.713819400404966,0.632452686846316,0.00949268833951758,0.990507311660482,0.0293433502827447,0.961163961377738,0.614535774455761,0.346628186921977,0.304509154209104,0.0421190327128729,196467,310643,0.0306080770605354,0.0714911758198744,470072 +INF0169,0,Ctrl,2025-07-31,Female,HEU-lo,1288912,1144653,1051293,973587,0.877778770669699,0.842549795575443,0.826082326812498,0.351936709127375,0.771953332025548,0.130222135036557,0.641731196988991,0.251161213314138,0.0128673550436855,0.987132644956315,0.0153958167858088,0.971736828170506,0.745724119671697,0.226012708498809,0.135041037860736,0.0909716706380725,75540,300763,0.157450204424557,0.173917673187502,854594 +INF0169,4,Ctrl,2025-07-31,Female,HEU-lo,1068232,944862,869444,785215,0.916182192138459,0.94555323881012,0.865148735056992,0.368202668890742,0.781063480378277,0.167733167223512,0.613330313154765,0.37912679087151,0.0106148867313916,0.989385113268608,0.0155240229026637,0.973861090365945,0.812735872541698,0.161125217824247,0.0949166044311675,0.0662086133930794,100425,264885,0.0544467611898805,0.134851264943008,719400 +INF0169,9,Ctrl,2025-07-31,Female,HEU-lo,778672,685649,594814,542125,0.951313811390362,0.975039313130295,0.922139642565601,0.573702181951444,0.867772310021766,0.302004893942057,0.565767416079709,0.461223620705971,0.0194995053676767,0.980500494632323,0.0165243835415674,0.963976111090756,0.829546037445499,0.134430073645257,0.0826072619352948,0.0518228117099623,136465,295876,0.0249606868697053,0.0778603574343989,515731 +INF0124,0,PPD,2025-07-31,Male,HEU-hi,1246824,1108772,973652,900843,0.781135003546678,0.864643019554343,0.85943468622101,0.643083503865393,0.812693221368985,0.207716700734766,0.604976520634219,0.152471134191481,0.014218009478673,0.985781990521327,0.00927576561299767,0.976506224908329,0.66962331695581,0.30688290795252,0.266446367233358,0.0404365407191617,68997,452525,0.135356980445657,0.14056531377899,703680 +INF0124,4,PPD,2025-07-31,Male,HEU-hi,1515456,1357582,1150459,1069355,0.887128222152606,0.906098634382362,0.896618897280887,0.637026105380776,0.772967212626465,0.207635714971257,0.565331497655208,0.425400203204273,0.00905176270144743,0.990948237298553,0.0075463771554826,0.98340186014307,0.516109959272903,0.467291900870167,0.416626147029878,0.0506657538402891,257077,604318,0.0939013656176376,0.103381102719113,948655 +INF0124,9,PPD,2025-07-31,Male,HEU-hi,1583312,1418103,1190344,1093566,0.859891401159144,0.97322799644387,0.962200164194532,0.606947640660692,0.906363996341604,0.342808133972968,0.563555862368636,0.530500646526802,0.00374530598225108,0.996254694017749,0.00994454701283775,0.986310147004911,0.648634812850297,0.337675334154614,0.302699328553169,0.0349760056014453,302779,570742,0.0267720035561303,0.0377998358054678,940348 +INF0149,0,PPD,2025-07-31,Female,HU,1153168,1032394,892184,812261,0.891197533797634,0.892793744862789,0.87600240369672,0.594862443620188,0.826509711759078,0.153493167863413,0.673016543895665,0.213143154394211,0.0175960427970626,0.982403957202937,0.0222047896101632,0.960199167592774,0.618411017410821,0.341788150181953,0.301834782419211,0.0399533677627422,91782,430612,0.107206255137211,0.12399759630328,723885 +INF0149,4,PPD,2025-07-31,Female,HU,1238584,1092917,869629,826659,0.951025755480797,0.982711206425041,0.953305502344265,0.687894791738216,0.949294107857731,0.307957581753127,0.641336526104603,0.564305063747562,0.00772661290586836,0.992273387094132,0.0191494172272666,0.973123969866865,0.66995763142287,0.303166338443995,0.26586036391757,0.0373059745264255,305179,540805,0.0172887935749593,0.0466944976557352,786174 +INF0149,9,PPD,2025-07-31,Female,HU,1216752,1066815,870494,816153,0.934514729468617,0.965079643952396,0.928110008168274,0.65979596358759,0.877932798257659,0.211600636685737,0.666332161571922,0.587092210138088,0.0110308925918028,0.988969107408197,0.028672197344327,0.96029691006387,0.60315864650711,0.357138263556761,0.315184316433288,0.0419539471234722,295443,503231,0.0349203560476041,0.0718899918317257,762707 +INF0169,0,PPD,2025-07-31,Female,HEU-lo,1218624,1082765,987457,903485,0.85632190905217,0.842848538273226,0.825762530471491,0.384300105729287,0.764246291070654,0.123404512937109,0.640841778133545,0.249883123740848,0.012436739528373,0.987563260471627,0.0137019489609131,0.973861311510714,0.744037364057284,0.22982394745343,0.134381393345537,0.0954425541078927,74296,297323,0.157151461726774,0.174237469528509,773674 +INF0169,4,PPD,2025-07-31,Female,HEU-lo,940776,820971,737842,662123,0.926151183390397,0.92995404630593,0.8459621738152,0.381591778561248,0.740784266801138,0.161742207331561,0.579042059469577,0.342556901223066,0.0119512468967926,0.988048753103207,0.015793610199728,0.972255142903479,0.809965194176574,0.162289948726905,0.0932521613293579,0.0690377873975474,80159,234002,0.0700459536940704,0.1540378261848,613226 +INF0169,9,PPD,2025-07-31,Female,HEU-lo,1054184,923351,814226,740463,0.941281333435972,0.956064988579365,0.903875842200108,0.518514054842005,0.787211258564013,0.264463358753279,0.522747899810734,0.416426855858947,0.0214824412771188,0.978517558722881,0.0152895445031396,0.963228014219741,0.829416259676401,0.13381175454334,0.0789527891292069,0.0548589654141334,150495,361396,0.0439350114206352,0.0961241577998921,696984 +INF0124,0,SEB,2025-07-31,Male,HEU-hi,1004008,900404,794342,737214,0.815346697159848,0.858233028606603,0.850839731485564,0.645535989086402,0.90635582518517,0.244872713402848,0.661483111782322,0.178788831561097,0.0139389396603915,0.986061060339608,0.00593882434341396,0.980122235996195,0.65523106639375,0.324891169602445,0.256133421743016,0.0687577478594286,69374,388022,0.141766971393397,0.149160268514436,601085 +INF0124,4,SEB,2025-07-31,Male,HEU-hi,1571248,1425147,1204162,1120656,0.879540197884096,0.899691780752428,0.891540913619476,0.636573186345826,0.779254310331088,0.235330211683555,0.543924098647533,0.407646235691996,0.00896878518703866,0.991031214812961,0.00402305141999249,0.987008163392969,0.48618713249093,0.500821030902039,0.445170774427624,0.0556502564744151,255776,627446,0.100308219247572,0.108459086380524,985662 +INF0124,9,SEB,2025-07-31,Male,HEU-hi,1109328,998592,812606,756059,0.904774627376964,0.966187324851658,0.954087562110507,0.656252421195124,0.903795347925456,0.368147412222277,0.53564793570318,0.510429521649834,0.00333419161127865,0.996665808388721,0.00606176982731157,0.99060403856141,0.663831440030374,0.326772598531035,0.289782273796483,0.0369903247345521,229141,448918,0.0338126751483416,0.0459124378894926,684063 +INF0149,0,SEB,2025-07-31,Female,HU,1225472,1099942,970297,887529,0.895820868951888,0.877578870711525,0.860238193762287,0.535075660290265,0.797532326800981,0.16081481638189,0.636717510419091,0.218588175007816,0.0179800412938747,0.982019958706125,0.0121838437715072,0.969836114934618,0.576006538196834,0.393829576737784,0.319565123881624,0.0742644528561597,92992,425421,0.122421129288475,0.139761806237713,795067 +INF0149,4,SEB,2025-07-31,Female,HU,1124960,999291,795445,758864,0.946020630837673,0.983822281902379,0.956350527440413,0.711361315836028,0.920366095083681,0.332892750353935,0.587473344729746,0.523146271591014,0.007048105283646,0.992951894716354,0.0117006782350916,0.981251216481262,0.663539997903909,0.317711218577353,0.275523648395742,0.0421875701816113,267164,510687,0.0161777180976207,0.043649472559587,717901 +INF0149,9,SEB,2025-07-31,Female,HU,531432,467288,379931,358096,0.92417396452348,0.969384455933499,0.925790846157798,0.651432421897426,0.89664497395483,0.255715789913121,0.640929184041709,0.552259644598236,0.0108684696791534,0.989131530320847,0.0216865445993617,0.967444985721485,0.571140601377457,0.396304384344028,0.34592642365194,0.050377960692088,119060,215587,0.0306155440665009,0.0742091538422024,330943 +INF0169,0,SEB,2025-07-31,Female,HEU-lo,1237144,1103284,1012883,939441,0.876379676850382,0.844672764837418,0.827158034609204,0.358358425228985,0.774778927531614,0.138666413592779,0.636112513938835,0.265283572680222,0.0129553207527885,0.987044679247212,0.00994007844740574,0.977104600799806,0.719211948536458,0.257892652263348,0.137052983940002,0.120839668323346,78269,295039,0.155327235162582,0.172841965390796,823307 +INF0169,4,SEB,2025-07-31,Female,HEU-lo,698912,617805,566286,511948,0.921683452225617,0.933040728699979,0.850002331229575,0.381090337265341,0.73006189557277,0.16779094533948,0.56227095023329,0.332923662126916,0.0121103798483279,0.987889620151672,0.0104566866000735,0.977432933551599,0.795125780910701,0.182307152640898,0.0982360605351953,0.0840710921057027,59866,179819,0.0669592713000208,0.149997668770425,471854 +INF0169,9,SEB,2025-07-31,Female,HEU-lo,887744,782828,694751,633595,0.93819869159321,0.95722682601045,0.905700846850302,0.520298163980096,0.774770842426888,0.261616308582699,0.513154533844189,0.40678662075432,0.0211186443372307,0.978881355662769,0.0102612607600169,0.968620094902752,0.834238115298101,0.134381979604651,0.0766693425957572,0.0577126370088942,125813,309285,0.0427731739895498,0.0942991531496977,594438 +INF0019,0,Ctrl,2025-08-05,Female,HEU-lo,1324344,1197859,1022143,939295,0.930082668384267,0.868875783805811,0.863010546895568,0.690163480315285,0.91948810996746,0.102868932666824,0.816619177300636,0.345066357958145,0.00882458965177477,0.991175410348225,0.0146163274134243,0.976559082934801,0.733344548316551,0.24321453461825,0.222489245632165,0.0207252889860854,208055,602942,0.131124216194189,0.136989453104432,873622 +INF0019,4,Ctrl,2025-08-05,Female,HEU-lo,1244280,1117290,891334,840761,0.905377390245266,0.955721578652822,0.935905654973818,0.704970796341595,0.886148318760855,0.352806786078997,0.533341532681858,0.451748697421678,0.00439318375883277,0.995606816241167,0.0133404284282302,0.982266387812937,0.652608478638402,0.329657909174535,0.293807054669356,0.035850854505179,242421,536628,0.0442784213471781,0.0640943450261822,761206 +INF0019,9,Ctrl,2025-08-05,Female,HEU-lo,1844096,1632745,1274587,1217805,0.930321356867479,0.964861644379717,0.957356458802242,0.793717286729335,0.940427604582526,0.21288596395631,0.727541640626216,0.703361275385269,0.00365696325012807,0.996343036749872,0.0164096937194463,0.979933343030426,0.699705292715165,0.280228050315261,0.26313218190902,0.0170958684062407,632492,899242,0.0351383556202833,0.042643541197758,1132950 +INF0032,0,Ctrl,2025-08-05,Female,HU,1124480,1006880,824473,773851,0.973138239790347,0.93983645480331,0.936204625370486,0.81375420946958,0.977386102358157,0.189406487176265,0.787979615181892,0.589146047137036,0.00786906496341065,0.992130935036589,0.015089991524344,0.977040943512245,0.713304010148629,0.263736933363617,0.236961061839051,0.0267758715245656,361034,612809,0.0601635451966898,0.0637953746295136,753064 +INF0032,4,Ctrl,2025-08-05,Female,HU,711784,637561,497456,468981,0.969265279403643,0.940503820118926,0.934273715425889,0.812375293411092,0.942385025955985,0.363519181973521,0.578865843982463,0.431871295145405,0.0113430439989717,0.988656956001028,0.0133871746477637,0.975269781353265,0.678833215241941,0.296436566111324,0.218145108194707,0.078291457916617,159481,369279,0.0594961798810736,0.0657262845741112,454567 +INF0032,9,Ctrl,2025-08-05,Female,HU,1248456,1118033,911093,872062,0.984879515447296,0.972946036447636,0.965117199688896,0.784273864911815,0.958258238642268,0.255593131767801,0.702665106874467,0.660764496120809,0.0196613246399019,0.980338675360098,0.0175763390078794,0.962762336352219,0.707335869167152,0.255426467185067,0.221487035118977,0.0339394320660905,445087,673594,0.0270539635523638,0.0348828003111042,858876 +INF0180,0,Ctrl,2025-08-05,Male,HEU-hi,1614504,1435508,1209469,1117422,0.939361315599657,0.867784231701032,0.861666077588712,0.699933216660966,0.927674650943114,0.107572676515665,0.820101974427449,0.387859435356761,0.0045269829237993,0.995473017076201,0.0201398100772745,0.975333206998926,0.66050084573867,0.314832361260256,0.295819032980299,0.019013328279957,284958,734694,0.132215768298968,0.138333922411288,1049663 +INF0180,4,Ctrl,2025-08-05,Male,HEU-hi,528392,465660,387783,356166,0.986118832229915,0.924284355763591,0.897517809248851,0.643003570391376,0.977466048521721,0.210988456275987,0.766477592245735,0.5716158114038,0.012913271155455,0.987086728844545,0.0140674867536331,0.973019242090912,0.521325876119357,0.451693365971555,0.374554581228891,0.0771387847426641,129092,225837,0.0757156442364089,0.102482190751149,351222 +INF0019,0,PPD,2025-08-05,Female,HEU-lo,1271392,1149523,966376,895883,0.931680810998758,0.911539433816914,0.906465614842628,0.722051763736152,0.940014601446871,0.10286719320369,0.83714740824318,0.358623149930311,0.00879542878293659,0.991204571217063,0.0149813773798783,0.976223193837185,0.735419992134546,0.24080320170264,0.219931986952599,0.0208712147500405,216135,602680,0.0884605661830864,0.0935343851573722,834677 +INF0019,4,PPD,2025-08-05,Female,HEU-lo,1374576,1213048,954728,905952,0.929225830949101,0.959040618459221,0.938433230304312,0.715411827034784,0.885281723115343,0.3552298184499,0.530051904665442,0.4494967273162,0.00475780623760218,0.995242193762398,0.0131135187449439,0.982128675017454,0.658989409448383,0.323139265569071,0.289232508228271,0.0339067573408,270713,602258,0.0409593815407788,0.0615667696956882,841834 +INF0019,9,PPD,2025-08-05,Female,HEU-lo,1725968,1521365,1188395,1141230,0.939210325701217,0.973696068964552,0.966078434116555,0.812773182939857,0.963162395615118,0.221661549057308,0.74150084655781,0.717317416133383,0.00372374217686095,0.996276257823139,0.0165176049632827,0.979758652859856,0.698383284606239,0.281375368253618,0.263582377594178,0.01779299065944,624909,871175,0.0263039310354479,0.0339215658834451,1071855 +INF0032,0,PPD,2025-08-05,Female,HU,1240368,1107613,907113,859658,0.976240551475121,0.915239272049598,0.912261553108612,0.6988631285948,0.983314834043467,0.168643618426998,0.81467121561647,0.671650392406596,0.00751404440901787,0.992485955590982,0.0149722411906714,0.977513714400311,0.721688426086934,0.255825288313376,0.229117429790648,0.0267078585227287,393929,586509,0.0847607279504023,0.0877384468913878,839233 +INF0032,4,PPD,2025-08-05,Female,HU,774384,688988,533872,502702,0.962799034020155,0.938179879793637,0.931460885411394,0.810487994859515,0.962080366679668,0.362208337475814,0.599872029203853,0.450324643045603,0.0114179290356181,0.988582070964382,0.0143332654031655,0.974248805561216,0.680716889704051,0.293531915857165,0.216431175418337,0.0771007404388289,176652,392277,0.0618201202063632,0.0685391145886062,484001 +INF0032,9,PPD,2025-08-05,Female,HU,1335992,1193171,967189,926155,0.985408489939589,0.971373190553569,0.9628320445827,0.777570808236755,0.954451745455109,0.258002967689387,0.696448777765722,0.653293275632959,0.0199027189094164,0.980097281090584,0.0174696131404968,0.962627667950087,0.705177899289266,0.257449768660821,0.222760755384433,0.0346890132763883,463605,709643,0.0286268094464307,0.0371679554172999,912641 +INF0180,0,PPD,2025-08-05,Male,HEU-hi,1570368,1398767,1158451,1068711,0.942663638719916,0.896367507581134,0.890511050340717,0.70957332234834,0.929576735786159,0.10813752274956,0.821439213036599,0.407784021520629,0.00477523464515067,0.995224765354849,0.0192518799055931,0.975972885449256,0.659836571710851,0.316136313738405,0.296812393654976,0.0193239200834294,291504,714849,0.103632492418866,0.109488949659283,1007435 +INF0180,4,PPD,2025-08-05,Male,HEU-hi,638600,551845,454723,419608,0.989857200053383,0.93640815501069,0.908740056626668,0.631904986613764,0.981166869234902,0.198142214331163,0.783024654903739,0.594365682019942,0.0128398258963198,0.98716017410368,0.013935986769146,0.973224187334534,0.518778966531837,0.454445220802697,0.378848582362707,0.07559663843999,155999,262463,0.0635918449893103,0.0912599433733315,415352 +INF0180,9,PPD,2025-08-05,Male,HEU-hi,1516936,1391367,1205249,1116976,0.580700032946097,0.859905832002319,0.852679810307295,0.619310298044488,0.699471249831965,0.106603900403782,0.592867349428183,0.434677945342567,0.018629983219843,0.981370016780157,0.0152624977807813,0.966107518999376,0.298383263368287,0.667724255631089,0.591028056651643,0.0766961989794457,174611,401702,0.140094167997681,0.147320189692705,648628 +INF0019,0,SEB,2025-08-05,Female,HEU-lo,1353632,1227164,1049849,966363,0.931358092145498,0.874083086119352,0.868618823816984,0.700898858926925,0.923351774646101,0.104785758445223,0.818566016200878,0.359317090182775,0.00802054105564085,0.991979458944359,0.00897788836536256,0.983001570578997,0.701554696737078,0.281446873841919,0.234563326098082,0.0468835477438368,226668,630830,0.125916913880648,0.131381176183016,900030 +INF0019,4,SEB,2025-08-05,Female,HEU-lo,1170048,1047919,832442,792400,0.917228672387683,0.96310875439591,0.942818775694402,0.723126475622307,0.904638140557901,0.344459517825171,0.56017862273273,0.484003295425789,0.00425346232619575,0.995746537673804,0.00847547576273385,0.98727106191107,0.625577381958558,0.361693679952512,0.323259205679669,0.0384344742728427,254381,525577,0.0368912456040902,0.0571812243055976,726812 +INF0019,9,SEB,2025-08-05,Female,HEU-lo,1710322,1517501,1200599,1151235,0.925440939512784,0.969865778111507,0.962381265252487,0.80652900319129,0.946442121041435,0.211284849105526,0.735157271935909,0.711653764331833,0.00369415231550906,0.996305847684491,0.0108077258314296,0.985498121853061,0.692474493341859,0.293023628511203,0.272495654178938,0.0205279743322644,611507,859276,0.0301342218884926,0.0376187347475126,1065400 +INF0032,0,SEB,2025-08-05,Female,HU,1027392,922706,754901,711686,0.97571541382014,0.955185965498421,0.951156605026188,0.835023754217652,0.990864768566664,0.225678330168684,0.76518643839798,0.575916239395836,0.00765404667291528,0.992345953327085,0.0082170203718621,0.984128932955223,0.68755858070737,0.296570352247852,0.251981637474883,0.0445887147729689,333941,579843,0.0448140345015791,0.0488433949738121,694403 +INF0032,9,SEB,2025-08-05,Female,HU,1155456,1036243,850931,814746,0.98729910917022,0.970027275055383,0.962124470722205,0.785860979266482,0.962943628439678,0.261944648775202,0.700998979664476,0.658102175924827,0.0194511749548094,0.980548825045191,0.0122952001846083,0.968253624860582,0.710602476827814,0.257651148032768,0.222056363216799,0.0355947848159686,416016,632145,0.029972724944617,0.0378755292777954,804398 +INF0180,0,SEB,2025-08-05,Male,HEU-hi,1661856,1483795,1251178,1155566,0.945002708629364,0.876733152444156,0.869922793959413,0.699612550400041,0.922558790344326,0.124676368415128,0.797882421929198,0.402479888374918,0.00404892532741009,0.99595107467259,0.0108816900767182,0.985069384595872,0.612174744462403,0.372894640133468,0.313003066776372,0.0598915733570957,307489,763986,0.123266847555844,0.130077206040587,1092013 +INF0155,0,Ctrl,2025-08-07,Female,HEU-lo,1956872,1761294,1560508,1450803,0.734109317391817,0.86158464219453,0.853166242272649,0.705002967002426,0.827947079489973,0.243380274937339,0.584566804552634,0.37507025258969,0.0103115479394658,0.989688452060534,0.0114868655592878,0.978201586501246,0.696086298850248,0.282115287650998,0.228192709479949,0.0539225781710495,281626,750862,0.13841535780547,0.146833757727351,1065048 +INF0155,4,Ctrl,2025-08-07,Female,HEU-lo,1215184,1083687,851644,825005,0.98352979678911,0.985920925985036,0.98077190889518,0.854323978915897,0.967996849453198,0.341870391928599,0.626126457524599,0.59517060412889,0.00328178777449222,0.996718212225508,0.011180861893451,0.985537350332057,0.721515827233506,0.264021523098551,0.223845072470794,0.040176450627757,412580,693213,0.014079074014964,0.0192280911048204,811417 +INF0155,9,Ctrl,2025-08-07,Female,HEU-lo,1123680,1000603,815357,761574,0.980901396318677,0.959184984786401,0.928468640441,0.618258461184238,0.931716960011432,0.317645938028437,0.614071021982995,0.495439064472337,0.0109735951962661,0.989026404803734,0.011511130922726,0.977515273881008,0.501966594121195,0.475548679759813,0.399603185008435,0.0759454947513788,228822,461857,0.0408150152135994,0.0715313595589997,747029 +INF0158,0,Ctrl,2025-08-07,Male,HU,1974064,1742021,1484261,1352364,0.92381784785753,0.802042361634722,0.793962082318796,0.613198349846078,0.932262704740423,0.332249912543141,0.600012792197282,0.366683113777458,0.00460996821079836,0.995390031789202,0.0221207277698077,0.973269304019394,0.590346477379117,0.382922826640277,0.359495644558992,0.023427182081285,280913,766092,0.197957638365278,0.206037917681204,1249338 +INF0158,4,Ctrl,2025-08-07,Male,HU,1017536,914368,805877,754118,0.947414065172824,0.973280594349315,0.924193309091316,0.565141323121454,0.828913347136503,0.594199201529576,0.234714145606927,0.196596098788425,0.0103426555807508,0.989657344419249,0.0161375661375661,0.973519778281683,0.573066263542454,0.400453514739229,0.368808264046359,0.0316452506928697,79380,403772,0.0267194056506854,0.0758066909086837,714462 +INF0158,9,Ctrl,2025-08-07,Male,HU,1148432,1020361,904910,847242,0.957195228754004,0.964520528351024,0.91473730418656,0.565784930750108,0.797826248043972,0.320764627166887,0.477061620877085,0.433948365218225,0.00991904053999759,0.990080959460002,0.0223090521917313,0.967771907268271,0.505695287074611,0.46207662019366,0.431159347502913,0.0309172726907469,199112,458838,0.035479471648976,0.0852626958134396,810976 +INF0159,0,Ctrl,2025-08-07,Male,HEU-hi,2024024,1786795,1447822,1277260,0.931853342310884,0.818567843396887,0.811916966541452,0.651424653782203,0.946597483936038,0.162708392984737,0.783889090951301,0.583682213434657,0.00516847824886035,0.99483152175114,0.0213721768375277,0.973459344913612,0.724433268294623,0.249026076618989,0.217864947818036,0.0311611288009528,452551,775338,0.181432156603113,0.188083033458548,1190219 +INF0159,4,Ctrl,2025-08-07,Male,HEU-hi,1487344,1333646,1131385,1067284,0.940156509420173,0.982565521310247,0.942089705744588,0.646537720223158,0.759423194013056,0.264593946774156,0.4948292472389,0.42502524104232,0.0127949864542873,0.987205013545713,0.0225689344402012,0.964636079105512,0.490235118756188,0.474400960349323,0.394639016729953,0.0797619436193709,275733,648745,0.0174344786897532,0.0579102942554121,1003414 +INF0159,9,Ctrl,2025-08-07,Male,HEU-hi,1167840,1028158,742821,709883,0.982519654647315,0.986670470870599,0.965210172708947,0.813984463937007,0.923115267211876,0.0548056921123134,0.868309575099563,0.858577887845167,0.00239002303859118,0.997609976961409,0.0274596209197793,0.970150356041629,0.627872387130393,0.342277968911237,0.327390074326639,0.0148878945845976,487443,567733,0.0133295291294012,0.0347898272910532,697474 +INF0155,0,PPD,2025-08-07,Female,HEU-lo,2221632,2004398,1728584,1609792,0.784455383055699,0.904280137154441,0.884300092650517,0.762086141224729,0.92752060018496,0.266291551066638,0.661229049118322,0.42905223562663,0.0100119397346134,0.989988060265387,0.0111574761386947,0.978830584126692,0.693289287902603,0.285541296224089,0.231345072861443,0.0541962233626458,412907,962370,0.0957198628455587,0.115699907349483,1262810 +INF0155,4,PPD,2025-08-07,Female,HEU-lo,1393256,1237743,976719,947853,0.987092935296929,0.986962641844597,0.982248115953182,0.856480041555377,0.963070560649114,0.341770461689747,0.621300098959367,0.590333179840242,0.00351120478081922,0.996488795219181,0.0112248629657737,0.985263932253407,0.718674493771364,0.266589438482043,0.226748573639117,0.0398408648429259,473057,801339,0.013037358155403,0.0177518840468182,935619 +INF0155,9,PPD,2025-08-07,Female,HEU-lo,1302344,1145745,915824,856281,0.980871933395696,0.959576236275185,0.932713578488919,0.651871289745708,0.966500946104897,0.340636118558998,0.625864827545899,0.500440176216603,0.0116133506085877,0.988386649391412,0.0115622547856713,0.976824394605741,0.496768189200533,0.480056205405208,0.406102301136882,0.0739539042683261,273995,547508,0.0404237637248155,0.0672864215110811,839902 +INF0158,0,PPD,2025-08-07,Male,HU,1897704,1691391,1435638,1304624,0.922783116054894,0.848499649052858,0.840498884860265,0.656822703165169,0.897703287684052,0.29528959618787,0.602413691496183,0.380556669141145,0.00439650273659864,0.995603497263401,0.022052299440717,0.973551197822684,0.60114116329535,0.372410034527334,0.349540244781853,0.0228697897454814,300921,790739,0.151500350947142,0.159501115139735,1203885 +INF0158,4,PPD,2025-08-07,Male,HU,1229864,1101656,968001,903455,0.944291635997366,0.969077216117216,0.919578021978022,0.52821684981685,0.851467373816947,0.604866466208794,0.246600907608153,0.205767417089219,0.0116795720725579,0.988320427927442,0.0148394193645795,0.973481008562863,0.564210685244699,0.409270323318163,0.377326747622026,0.031943575696137,92726,450635,0.0309227838827839,0.080421978021978,853125 +INF0158,9,PPD,2025-08-07,Male,HU,1371136,1216419,1068812,1005622,0.948960941586401,0.96633644068507,0.920389480831943,0.593111571252525,0.84213539126932,0.346419813287539,0.495715577981781,0.454252973477219,0.00900785270060558,0.990992147299394,0.0225079635485339,0.968484183750861,0.506730608418997,0.461753575331863,0.43024553788471,0.0315080374471528,257109,566004,0.0336635593149296,0.0796105191680568,954296 +INF0159,0,PPD,2025-08-07,Male,HEU-hi,1898040,1677926,1357904,1200314,0.92715656069995,0.836210405623612,0.830270856040953,0.664310315856441,0.953162260904616,0.171448010745343,0.781714250159273,0.588793137264185,0.00438555180074111,0.995614448199259,0.021238568044972,0.974375880154287,0.719421171486792,0.254954708667495,0.223869899125417,0.0310848095420786,435293,739297,0.163789594376388,0.169729143959047,1112879 +INF0159,4,PPD,2025-08-07,Male,HEU-hi,1468272,1314327,1118313,1054808,0.946339997421332,0.981112134056363,0.940226826700274,0.633504874239511,0.820599997786103,0.307417030246581,0.513182967539522,0.438671092352724,0.0131866388850837,0.986813361114916,0.0228152644898018,0.963998096625114,0.479992934441713,0.484005162183402,0.403468612338772,0.0805365498446298,277402,632369,0.0188878659436369,0.0597731732997264,998207 +INF0159,9,PPD,2025-08-07,Male,HEU-hi,1124616,979389,693430,664229,0.986489599219546,0.987891736804755,0.970960923609892,0.834537699063723,0.953283897336491,0.0770854096756791,0.876198487660812,0.865529821609809,0.00256495852542351,0.997435041474577,0.0272806791435489,0.970154362331028,0.626557673536135,0.343596688794892,0.328836556786153,0.0147601320087386,473302,546835,0.0121082631952446,0.0290390763901077,655255 +INF0155,0,SEB,2025-08-07,Female,HEU-lo,2378848,2136279,1866817,1735030,0.768161357440505,0.871291875721704,0.849967324012986,0.725989902332188,0.917141300988955,0.265460366871403,0.651680934117552,0.427269072445165,0.00920371535000726,0.990796284649993,0.00827487784819312,0.9825214068018,0.683459919694258,0.299061487107542,0.234429877606308,0.0646316095012336,413420,967587,0.128708124278296,0.150032675987014,1332783 +INF0155,4,SEB,2025-08-07,Female,HEU-lo,995464,892094,720248,700245,0.986965990474762,0.988068607676258,0.983642446007773,0.852773332484467,0.955501410835693,0.343553337733534,0.611948073102159,0.563346777135469,0.00340041804962382,0.996599581950376,0.00690324018577306,0.989696341764603,0.704103391984772,0.285592949779831,0.238706937575674,0.0468860122041576,332018,589367,0.0119313923237421,0.016357553992227,691118 +INF0158,0,SEB,2025-08-07,Male,HU,1995888,1767501,1513529,1376026,0.927221578662031,0.808748621540724,0.801494026480526,0.617858562044579,0.886202706028309,0.318907186730161,0.567295519298148,0.350209434311708,0.00469075432400616,0.995309245675994,0.0136267318663407,0.981682513809653,0.587833016390474,0.39384949741918,0.357326813365933,0.0365226840532464,276075,788314,0.191251378459276,0.198505973519474,1275881 +INF0158,4,SEB,2025-08-07,Male,HU,1006016,899118,788056,735913,0.950509095504496,0.970617247945652,0.921042699559109,0.55347309190098,0.810776184941237,0.568911274699729,0.241864910241508,0.201115846571096,0.0105699827900645,0.989430017209936,0.00946546453982687,0.979964552670109,0.538285684929747,0.441678867740361,0.406193008142611,0.0354858595977499,77862,387150,0.029382752054348,0.0789573004408914,699492 +INF0158,9,SEB,2025-08-07,Male,HU,1120552,994396,877895,829211,0.951199393158074,0.969440059841901,0.923015676803023,0.590119747193326,0.769334885939319,0.291835498244724,0.477499387694595,0.4362257065145,0.00997818196145644,0.990021818038544,0.0136030299000704,0.976418788138473,0.498879547682018,0.477539240456455,0.442625453721625,0.0349137867348296,203043,465454,0.0305599401580993,0.0769843231969775,788745 +INF0159,0,SEB,2025-08-07,Male,HEU-hi,2086792,1847605,1507051,1327409,0.929341295712173,0.817877686411331,0.811086269957588,0.63500068092502,0.933116486052797,0.168540889286612,0.764575596766184,0.573310423094746,0.00499887553133928,0.995001124468661,0.0134001037628507,0.98160102070581,0.708139149100091,0.273461871605719,0.229282499927633,0.0441793716780858,449101,783347,0.182122313588669,0.188913730042412,1233616 +INF0159,4,SEB,2025-08-07,Male,HEU-hi,1459280,1303303,1109557,1042434,0.940995784865037,0.978019748686445,0.936432513767603,0.633759325372148,0.809547172057246,0.292138446219946,0.5174087258373,0.446210294512692,0.0123001052646758,0.987699894735324,0.0150975500728201,0.972602344662504,0.473806399515494,0.49879594514701,0.416260508442804,0.0825354367042063,277396,621671,0.0219802513135547,0.0635674862323967,980926 +INF0159,9,SEB,2025-08-07,Male,HEU-hi,527136,464846,340607,329303,0.989851291971224,0.990468184844199,0.978966808912723,0.810075438472701,0.908817547992259,0.101222103138385,0.807595444853874,0.791356280746668,0.00333078101071976,0.99666921898928,0.0168501148545176,0.979819104134763,0.607656967840735,0.372162136294028,0.351852029096478,0.0203101071975498,208960,264053,0.00953181515580082,0.0210331910872773,325961 +INF0013,0,Ctrl,2025-08-22,Male,HEU-lo,1284824,1149119,931095,865836,0.966202606498228,0.932750638617311,0.92304556804965,0.750423453781081,0.949825099078664,0.0932661552381074,0.856558943840557,0.291104902323092,0.00844865417973089,0.991551345820269,0.00902320643936285,0.982528139380906,0.850868121104672,0.131660018276234,0.12322777987535,0.00843223840088426,182751,627784,0.0672493613826887,0.0769544319503498,836573 +INF0013,4,Ctrl,2025-08-22,Male,HEU-lo,1212080,1066572,933636,828526,0.95181563402959,0.847583831682315,0.831272730039411,0.60063606068445,0.925172696257263,0.148377330766113,0.77679536549115,0.594396027563843,0.0112913079305544,0.988708692069446,0.0117814622226011,0.976927229846845,0.529906515500241,0.447020714346603,0.122662887506038,0.324357826840565,281544,473664,0.152416168317685,0.168727269960589,788604 +INF0013,9,Ctrl,2025-08-22,Male,HEU-lo,591208,513249,411678,387329,0.98218826888769,0.981357937071209,0.957161632889099,0.743813579370712,0.979025971042764,0.223218797818842,0.755807173223922,0.739819556205803,0.00397428181097322,0.996025718189027,0.00966820479015601,0.986357513398871,0.631418799499393,0.354938713899477,0.330366952318172,0.0245717615813056,209346,282969,0.0186420629287911,0.0428383671109008,380430 +INF0023,0,Ctrl,2025-08-22,Female,HEU-hi,1428512,1282467,1103378,1007499,0.960829737796266,0.84605411994401,0.843164761604694,0.703389856771708,0.877314930401553,0.283347481150115,0.593967449251439,0.320800521657909,0.00813056515668277,0.991869434843317,0.0207613248792547,0.971108109964062,0.74064138073111,0.230466729232953,0.199926751665255,0.0305399775676975,218435,680906,0.15394588005599,0.156835238395306,968035 +INF0023,4,Ctrl,2025-08-22,Female,HEU-hi,1945688,1737383,1389603,1347134,0.970804686096558,0.973963988487571,0.967753577753241,0.82823955271585,0.91921157707665,0.46567267523715,0.4535389018395,0.425440025849932,0.00191178449132644,0.998088215508674,0.0244929756567555,0.973595239851918,0.711776245263939,0.261818994587979,0.236718414325581,0.0251005802623984,460826,1083175,0.0260360115124285,0.0322464222467587,1307804 +INF0023,9,Ctrl,2025-08-22,Female,HEU-hi,987800,871641,686162,661242,0.967712274779884,0.980770192469979,0.97006369824908,0.82072599751208,0.977877892363703,0.332214343382028,0.645663548981675,0.598146145292245,0.00485146371589014,0.99514853628411,0.0375956604230069,0.957552875861103,0.581545337628767,0.376007538232335,0.327330548941209,0.048676989291126,314132,525176,0.0192298075300207,0.0299363017509204,639892 +INF0030,0,Ctrl,2025-08-22,Male,HU,1055672,939062,820166,756891,0.967538258481076,0.956857716766282,0.935349389134,0.547854014837756,0.885988459764958,0.214057651325382,0.671930808439576,0.213160354432273,0.00440827399118345,0.995591726008817,0.0174693934823026,0.978122332526514,0.649021877667473,0.32910045485904,0.304334607874089,0.0247658469849511,85521,401205,0.0431422832337185,0.064650610866,732321 +INF0030,4,Ctrl,2025-08-22,Male,HU,887272,774792,587687,558971,0.959545307359416,0.973952099157652,0.963873010190955,0.820582521375648,0.966016549806192,0.344733099157968,0.621283450648223,0.586763790369122,0.00488673765730881,0.995113262342691,0.0210029041626331,0.974110358180058,0.605254598257502,0.368855759922556,0.302152952565344,0.066702807357212,258250,440126,0.0260479008423479,0.0361269898090455,536358 +INF0030,9,Ctrl,2025-08-22,Male,HU,1059640,929289,780683,761469,0.997026799515148,0.989099123425162,0.984053055498844,0.880723915148083,0.981709414491887,0.19381141105212,0.787898003439767,0.731571076048755,0.00457105475657498,0.995428945243425,0.0326617807897131,0.962767164453712,0.52534420900923,0.437422955444482,0.392945120767021,0.0444778346774606,489165,668650,0.0109008765748382,0.0159469445011559,759205 +INF0013,0,PPD,2025-08-22,Male,HEU-lo,1309848,1169793,941515,876615,0.962326677047507,0.941158619708626,0.932124610296471,0.759162626394339,0.937937797264928,0.0886665355031526,0.849271261761776,0.284356252595945,0.00974147209348299,0.990258527906517,0.00882443385243921,0.981434094054078,0.848205460495969,0.133228633558108,0.124788586992334,0.00844004656577416,182108,640422,0.0588413802913738,0.0678753897035289,843590 +INF0013,4,PPD,2025-08-22,Male,HEU-lo,1021264,890816,775431,680459,0.904611446097414,0.847437499086185,0.828137717264695,0.527857155621549,0.906420905876161,0.1306524930522,0.775768412823961,0.582688821659285,0.00979247764473483,0.990207522355265,0.012153447173967,0.978054075181298,0.563225918903073,0.414828156278225,0.36157693750033,0.0532512187778946,189329,324923,0.152562500913815,0.171862282735305,615551 +INF0013,9,PPD,2025-08-22,Male,HEU-lo,739216,639880,503620,472587,0.982966099363715,0.979256765338391,0.957546976882358,0.746838249698086,0.975531369078845,0.202663907256135,0.77286746182271,0.752431298171987,0.00539755749988508,0.994602442500115,0.00971866811725226,0.984883774382863,0.620462450774582,0.364421323608281,0.338517644535021,0.0259036790732597,261044,346934,0.0207432346616093,0.0424530231176419,464537 +INF0023,0,PPD,2025-08-22,Female,HEU-hi,1572088,1406726,1193232,1088074,0.963874699698734,0.860464717139269,0.857511725674053,0.722300568191028,0.866451932279463,0.280125408402363,0.5863265238771,0.293390977195472,0.00882785679254536,0.991172143207455,0.0203418657283882,0.970830277479066,0.733432020553338,0.237398256925728,0.203517644465042,0.0338806124606863,222251,757525,0.139535282860731,0.142488274325947,1048767 +INF0023,4,PPD,2025-08-22,Female,HEU-hi,1960856,1733414,1389954,1349503,0.97374070305883,0.974950268860164,0.969395753333546,0.816614994985031,0.920252430839653,0.478423910105993,0.44182852073366,0.41255500491107,0.00191097046127574,0.998089029538724,0.0242485436191431,0.973840485919581,0.713799420384137,0.260041065535444,0.234965790014615,0.0250752755208298,442707,1073086,0.0250497311398362,0.0306042466664536,1314066 +INF0023,9,PPD,2025-08-22,Female,HEU-hi,942384,831282,659209,636544,0.965433654232857,0.981319391220439,0.969826260574966,0.819434342053663,0.976605318760227,0.343987799259695,0.632617519500532,0.588131682208842,0.00467976054212291,0.995320239457877,0.0367965587215407,0.958523680736336,0.586502976341211,0.372020704395126,0.324355351167745,0.0476653532273803,296169,503576,0.0186806087795607,0.0301737394250343,614541 +INF0030,0,PPD,2025-08-22,Male,HU,972560,864436,748225,696152,0.967973948218205,0.94563980191643,0.924446878195225,0.564357126215206,0.915665691987294,0.220120642867661,0.695545049119633,0.217351747060185,0.00416172663263084,0.995838273367369,0.0178930049118053,0.977945268455564,0.648612354521038,0.329332913934525,0.304435142393961,0.0248977715405647,82658,380296,0.0543601980835696,0.0755531218047746,673857 +INF0030,4,PPD,2025-08-22,Male,HU,983584,844256,638719,608344,0.973238825401418,0.972557020862609,0.963926197167874,0.819625918819587,0.948748225218486,0.355848587696359,0.592899637522127,0.555135171893643,0.0058947774795743,0.994105222520426,0.0206465694845039,0.973458653035922,0.598208551881837,0.375250101154085,0.307887048936304,0.0673630522177801,269391,485271,0.0274429791373906,0.0360738028321262,592064 +INF0030,9,PPD,2025-08-22,Male,HU,1369512,1205519,999002,973830,0.996570243266279,0.990564560170635,0.984433636616554,0.888463559645128,0.979156736194469,0.202834461203022,0.776322274991447,0.725544363840904,0.00440699044272911,0.995593009557271,0.0321021360396549,0.963490873517616,0.543279459460324,0.420211414057292,0.376963124823169,0.0432482892341236,625597,862245,0.00943543982936457,0.0155663633834455,970490 +INF0013,0,SEB,2025-08-22,Male,HEU-lo,1304808,1167431,967694,900086,0.963833455914213,0.930778425719828,0.919863567149607,0.731671302417314,0.937149960062954,0.10830737819201,0.828842581870944,0.296109170711573,0.00917240828921816,0.990827591710782,0.00503844005214014,0.985789151658642,0.773584102577745,0.212205049080897,0.17543028916496,0.0367747599159373,187955,634749,0.0692215742801715,0.080136432850393,867533 +INF0013,4,SEB,2025-08-22,Male,HEU-lo,1108496,975841,843244,746237,0.875108042083145,0.883216596890227,0.866020047837951,0.519903895332278,0.895616419796358,0.120630189357234,0.774986230439124,0.60606979915586,0.00892739987656181,0.991072600123438,0.00634200154540727,0.984730598578031,0.529000685227753,0.455729913350278,0.401436548396032,0.0542933649542453,205771,339517,0.116783403109773,0.133979952162049,653038 +INF0013,9,SEB,2025-08-22,Male,HEU-lo,338400,296428,235954,224609,0.973162250844801,0.98512679510113,0.96496035794511,0.781618713428889,0.98204826540706,0.217726972086136,0.764321293320925,0.748031864767892,0.00402976549112278,0.995970234508877,0.00665106925719294,0.989319165251684,0.625662172630459,0.363656992621226,0.337897792627485,0.0257591999937402,127799,170847,0.0148732048988705,0.0350396420548904,218581 +INF0023,0,SEB,2025-08-22,Female,HEU-hi,1553624,1392141,1200738,1097477,0.961156361363382,0.842094635525342,0.839047748156842,0.695863949937763,0.866243886489653,0.296521940520142,0.569721945969511,0.334008146805989,0.00759466823291404,0.992405331767086,0.010641508818299,0.981763822948787,0.657619956601896,0.324143866346891,0.233648214314848,0.0904956520320428,245172,734030,0.157905364474658,0.160952251843158,1054847 +INF0023,4,SEB,2025-08-22,Female,HEU-hi,1938960,1727707,1390235,1352003,0.974983043676678,0.973879895006752,0.968768301749382,0.812414086088395,0.935776929484139,0.488083943718788,0.447692985765351,0.423472417798728,0.00190297684674752,0.998097023153252,0.0136758544652701,0.984421168687982,0.703230429988975,0.281190738699008,0.245587651598677,0.0356030871003308,453500,1070908,0.0261201049932482,0.0312316982506182,1318180 +INF0023,9,SEB,2025-08-22,Female,HEU-hi,904872,793595,633506,611464,0.957374432509518,0.979145883156816,0.968143149982918,0.821083020157158,0.971231343438841,0.380720755957409,0.590510587481432,0.543729273377134,0.00462215419934953,0.99537784580065,0.0153969772335948,0.979980868567056,0.561159364836426,0.418821503730629,0.359801033097379,0.0590204706332504,261350,480662,0.0208541168431842,0.0318568500170824,585400 +INF0030,0,SEB,2025-08-22,Male,HU,1039944,924772,816017,756973,0.967017317658622,0.960038578918752,0.938458154714579,0.543828875719598,0.88617032500515,0.227832679370789,0.65833764563436,0.221035153208101,0.00398904433407962,0.99601095566592,0.0100464820265709,0.985964473639349,0.606050618813288,0.379913854826062,0.328624518416656,0.0512893364094055,87991,398086,0.039961421081248,0.0615418452854212,732006 +INF0030,4,SEB,2025-08-22,Male,HU,776400,671086,524037,503966,0.974065710782077,0.979785942439947,0.9725400084743,0.853854991688667,0.979747300514847,0.400874141723567,0.57887315879128,0.548695706112789,0.00444805815955615,0.995551941840444,0.0138442005669861,0.981707741273458,0.59258309129172,0.389124649981738,0.320364540758648,0.0687601092230899,229988,419154,0.0202140575600535,0.0274599915256999,490896 +INF0030,9,SEB,2025-08-22,Male,HU,1288944,1140767,954830,930021,0.996728030872421,0.988507817877015,0.982723430329522,0.876881651991741,0.981596850587439,0.215690471796764,0.765906378790675,0.717375899612475,0.00418782444063733,0.995812175559363,0.0166741265504983,0.979138049008864,0.543307626745141,0.435830422263723,0.388106029815526,0.0477243924481967,583119,812850,0.0114921821229845,0.0172765696704776,926978 +INF0166,0,Ctrl,2025-08-28,Female,HU,1142328,1017218,889137,819646,0.902212662539682,0.902008803304958,0.89485256830675,0.618988634135457,0.762528427772158,0.0749357166420165,0.687592711130142,0.492966515852921,0.00387325504099269,0.996126744959007,0.00858852204741857,0.987538222911589,0.842814092621316,0.144724130290273,0.135945047640151,0.00877908265012187,225650,457739,0.0979911966950419,0.10514743169325,739495 +INF0166,4,Ctrl,2025-08-28,Female,HU,910864,805652,630109,604513,0.989270702201607,0.977171599275618,0.961137206179654,0.796360365000242,0.943407279866455,0.410589087549476,0.53281819231698,0.485300633077513,0.0113749448343299,0.98862505516567,0.00761502583051375,0.981010029335156,0.667746904232397,0.31326312510276,0.263912565657964,0.0493505594447954,231122,476245,0.022828400724382,0.0388627938203459,598027 +INF0166,9,Ctrl,2025-08-28,Female,HU,1053896,933222,740554,713494,0.978962682236991,0.979133380292176,0.963402168124109,0.803150823784081,0.935201822498877,0.276155639692828,0.659046182806049,0.631649874863633,0.00772968945782113,0.992270310542179,0.00842956641493673,0.983840744127242,0.701231557677763,0.282609186449479,0.242981475837312,0.0396277106121666,354348,560988,0.0208666197078243,0.0365978318758912,698484 +INF0199,0,Ctrl,2025-08-28,Male,HEU-hi,1729240,1545717,1379096,1282394,0.867265442601884,0.896476816618952,0.873258369178979,0.717055573937938,0.28363795498889,0.0213393990159149,0.262298555972975,0.21283724476233,0.00818329641325352,0.991816703586746,0.0199721921101004,0.971844511476646,0.552840882311354,0.419003629165292,0.373862940095207,0.0451406890700853,169736,797492,0.103523183381048,0.126741630821021,1112176 +INF0199,4,Ctrl,2025-08-28,Male,HEU-hi,955672,847071,733820,687490,0.930010618336267,0.934141729475596,0.901921100828468,0.565672932701256,0.826955617735211,0.233648348245391,0.59330726948982,0.521875933155642,0.0159364238410596,0.98406357615894,0.0125139072847682,0.971549668874172,0.286638410596027,0.684911258278146,0.529997350993378,0.154913907284768,188750,361676,0.0658582705244044,0.0980788991715321,639373 +INF0199,9,Ctrl,2025-08-28,Male,HEU-hi,1090984,980857,815737,784725,0.987602026187518,0.97428760922637,0.950512002642594,0.742637381354226,0.926212033547567,0.20359800604996,0.722614027497607,0.674732121603848,0.00524803263153558,0.994751967368464,0.0140136376745911,0.980738329693873,0.336626014585308,0.644112315108566,0.534534526801533,0.109577788307033,388336,575541,0.0257123907736297,0.0494879973574057,774996 +INF0207,0,Ctrl,2025-08-28,Male,HEU-lo,1373960,1231782,1089637,986621,0.917642134112288,0.63901299475902,0.63159830565573,0.394152634572797,0.91575499086456,0.337731048165626,0.578023942698934,0.109443130485467,0.0260914095506337,0.973908590449366,0.015567789015491,0.958340801433875,0.651952374855972,0.306388426577903,0.247727563692229,0.058660862885674,39055,356852,0.36098700524098,0.36840169434427,905365 +INF0207,4,Ctrl,2025-08-28,Male,HEU-lo,864640,768455,603156,581744,0.986143389532165,0.971151315273418,0.956406238288393,0.818066772067501,0.970326712989894,0.492044720878053,0.478281992111841,0.372480082503926,0.00918716999696812,0.990812830003032,0.0178766539480233,0.972936176055009,0.451521374757593,0.521414801297416,0.454879325435189,0.0665354758622268,174809,469311,0.0288486847265824,0.0435937617116072,573683 +INF0207,9,Ctrl,2025-08-28,Male,HEU-lo,1155280,1020738,803205,743244,0.981793327628612,0.965042372881356,0.952004352402044,0.778534545135615,0.96670867760594,0.315897033300124,0.650811644305816,0.601995050219501,0.00591233256432074,0.994087667435679,0.0177428456974769,0.976344821738202,0.702509086337015,0.273835735401188,0.238192147884338,0.0356435875168496,341997,568106,0.034957627118644,0.0479956475979565,729712 +INF0166,0,PPD,2025-08-28,Female,HU,1421024,1265409,1081320,999289,0.913050178677039,0.909845561326654,0.902988927017835,0.662145262883316,0.743515597326456,0.0731665734214804,0.670349023904976,0.475618314899477,0.00287811346100974,0.99712188653899,0.009069363578466,0.988052522960524,0.838769963214439,0.149282559746086,0.140460289342628,0.00882227040345791,287341,604142,0.0901544386733465,0.0970110729821646,912401 +INF0166,4,PPD,2025-08-28,Female,HU,895072,775403,609274,585499,0.990645586072735,0.976435376589164,0.957963663447249,0.793280254886884,0.965443797270277,0.420251238807268,0.54519255846301,0.498737285925411,0.00980917643880268,0.990190823561197,0.00757367776572148,0.982617145795476,0.681099359854279,0.301517785941197,0.251665729761765,0.0498520561794325,229479,460120,0.0235646234108361,0.0420363365527514,580022 +INF0166,9,PPD,2025-08-28,Female,HU,996616,876933,700861,676818,0.985086094045962,0.980557172083201,0.964765030207402,0.808679453566993,0.94496500150232,0.279680098522533,0.665284902979787,0.638831083562391,0.0074672798429897,0.99253272015701,0.00825697662265268,0.984275743534358,0.704746309909533,0.279529433624824,0.239013924212336,0.0405155094124888,344436,539166,0.0194428279167992,0.0352349697925979,666724 +INF0199,0,PPD,2025-08-28,Male,HEU-hi,1516328,1353418,1204623,1122951,0.855110329836297,0.90664797703091,0.883277948277891,0.726175661053875,0.292509192494565,0.020824370292611,0.271684822201954,0.22272797673338,0.00813212285107205,0.991867877148928,0.019490052153757,0.972377824995171,0.554053183954671,0.4183246410405,0.370826089755972,0.0474985512845277,155310,697308,0.0933520229690903,0.116722051722109,960247 +INF0199,4,PPD,2025-08-28,Male,HEU-hi,897696,790855,670560,632602,0.937085244751044,0.939225913542802,0.909882220370377,0.599200070175202,0.859586100499146,0.233278060398584,0.626308040100561,0.548494258277568,0.0174050064415462,0.982594993558454,0.0131551257769634,0.96943986778149,0.267480713856767,0.701959153924724,0.548701681987794,0.153257471936929,194829,355207,0.0607740864571982,0.0901177796296234,592802 +INF0199,9,PPD,2025-08-28,Male,HEU-hi,858968,768197,633815,610401,0.98810617938044,0.973886703109223,0.953236473726707,0.773676470344414,0.952894761655766,0.188153078630881,0.764741683024885,0.707733651068499,0.00545943425363508,0.994540565746365,0.0140497919782955,0.980490773768069,0.311602584677248,0.668888189090821,0.558709357040339,0.110178832050482,330254,466636,0.0261132968907768,0.0467635262732926,603141 +INF0207,0,PPD,2025-08-28,Male,HEU-lo,1232224,1105088,964965,866432,0.912570172846802,0.669899327161431,0.662423483583751,0.437218596650984,0.927630893838588,0.339022273647671,0.588608620190917,0.112016199016488,0.0265210205557277,0.973478979444272,0.0136607788451606,0.959818200599112,0.65434872430534,0.305469476293771,0.245945666769962,0.0595238095238095,38724,345700,0.330100672838569,0.337576516416249,790680 +INF0207,4,PPD,2025-08-28,Male,HEU-lo,964456,862394,674289,650158,0.985832674519117,0.971358006200201,0.957436418299797,0.726423557642052,0.962862892746763,0.463789655905618,0.499073236841144,0.370627943788539,0.0095095153102617,0.990490484689738,0.0172283906260866,0.973262094063652,0.403937090007186,0.569325004056466,0.502746806981757,0.0665781970747085,172564,465599,0.0286419937997994,0.042563581700203,640947 +INF0207,9,PPD,2025-08-28,Male,HEU-lo,1131528,982637,762643,713953,0.983508718361013,0.955307692198143,0.941492126651466,0.919422255578706,0.941057839308921,0.299647304286407,0.641410535022514,0.565919401981726,0.00585728479268223,0.994142715207318,0.0182533795712139,0.975889335636104,0.679510725126383,0.296378610509721,0.256338321148904,0.040040289360817,365357,645599,0.0446923078018568,0.0585078733485337,702179 +INF0166,0,SEB,2025-08-28,Female,HU,1550664,1380306,1200328,1097863,0.91635112942143,0.876639616392387,0.869641799234216,0.617185605172023,0.785068915423591,0.0850933957797154,0.699975519643875,0.529613178162234,0.00253922880428172,0.997460771195718,0.00601508332319669,0.991445687872522,0.822019827271621,0.1694258606009,0.142005230507238,0.0274206300936626,328840,620906,0.123360383607613,0.130358200765784,1006028 +INF0166,4,SEB,2025-08-28,Female,HU,775352,679787,538754,516822,0.988949773809938,0.976631299267674,0.959359121599809,0.795521912069981,0.960580423020167,0.423162813575996,0.537417609444171,0.494367929168716,0.0101387990647231,0.989861200935277,0.0036664842545147,0.986194716680762,0.640256703646585,0.345938013034177,0.290030346748918,0.0559076662852594,201010,406600,0.0233687007323262,0.0406408784001909,511111 +INF0166,9,SEB,2025-08-28,Female,HU,1043248,923970,742880,716921,0.981115074045815,0.982730578831986,0.967342070169552,0.814757841400548,0.945940050882416,0.303301773206814,0.642638277675602,0.6141730909497,0.00777898367493053,0.992221016325069,0.0048838834686653,0.987337132856404,0.680834379812145,0.306502753044259,0.259226533778063,0.0472762192661958,351974,573086,0.017269421168014,0.0326579298304478,703382 +INF0199,0,SEB,2025-08-28,Male,HEU-hi,1582712,1412403,1263938,1177939,0.869944029359755,0.866133979220115,0.843422874658084,0.708885464717426,0.282640716716408,0.0414248427915377,0.24121587392487,0.187879255090691,0.0113936107854631,0.988606389214537,0.0120896834701055,0.976516705744431,0.533514067995311,0.443002637749121,0.377667057444314,0.0653355803048066,136480,726424,0.133866020779885,0.156577125341916,1024741 +INF0199,4,SEB,2025-08-28,Male,HEU-hi,915104,813472,701070,665961,0.932535088391062,0.95633880379755,0.926079493488258,0.603382756444112,0.84911133646456,0.242567783945346,0.606543552519214,0.533737190435525,0.017189828101719,0.982810171898281,0.0044249557504425,0.978385216147839,0.242657573424266,0.735727642723573,0.579969200307997,0.155758442415576,200002,374720,0.0436611962024501,0.0739205065117418,621032 +INF0199,9,SEB,2025-08-28,Male,HEU-hi,333800,301408,254051,245249,0.982495341469282,0.988259267252112,0.96349125981507,0.795941997709125,0.948302022556273,0.205358027394975,0.742943995161299,0.688774525906344,0.00454208239337462,0.995457917606625,0.00611667095641115,0.989341246650214,0.31760511135672,0.671736135293494,0.553104513315872,0.118631621977623,132098,191787,0.0117407327478876,0.03650874018493,240956 +INF0207,0,SEB,2025-08-28,Male,HEU-lo,1196056,1073884,953274,871433,0.919260574249541,0.604085265531025,0.597713819197727,0.39015496695686,0.891970064919067,0.385367773394381,0.506602291524686,0.11529933481153,0.022005772005772,0.977994227994228,0.0057997557997558,0.972194472194472,0.417637917637918,0.554556554556555,0.39005439005439,0.164502164502165,36036,312543,0.395914734468975,0.402286180802273,801074 +INF0207,4,SEB,2025-08-28,Male,HEU-lo,766016,680078,547528,530330,0.987837761393849,0.981113995571505,0.966207910208445,0.830596701534703,0.969487490031783,0.511599901639269,0.457887588392514,0.360494377581107,0.00866361092163225,0.991336389078368,0.00758623767236378,0.983750151406004,0.409236084991362,0.574514066414642,0.498772814494176,0.0757412519204656,156863,435133,0.0188860044284951,0.0337920897915553,523880 +INF0207,9,SEB,2025-08-28,Male,HEU-lo,677136,599173,485830,453507,0.985559208567894,0.957409868488762,0.946164964045839,0.899464826672752,0.94905764098074,0.329227432261338,0.619830208719402,0.550475967792887,0.00663340924700864,0.993366590752991,0.00992752051476702,0.983439070238224,0.675970610562846,0.307468459675379,0.258983118244587,0.048485341430792,221304,402023,0.0425901315112381,0.0538350359541613,446958 +INF0614,0,Ctrl,2025-08-30,Female,HU,2502056,2240583,1939275,1791189,0.875958371785445,0.859828541236591,0.858035050194167,0.720463324892751,0.868600121017824,0.205269406198802,0.663330714819022,0.198508154548961,0.00489313535000624,0.995106864649994,0.0189308187311717,0.976176045918822,0.539608549172,0.436567496746823,0.383946237900854,0.0526212588459687,224396,1130412,0.140171458763409,0.141964949805833,1569007 +INF0614,4,Ctrl,2025-08-30,Female,HU,1391096,1344752,1105255,990319,0.672744842823373,0.908350244359322,0.897685791135821,0.636089230178076,0.813475292779559,0.300045070236418,0.513430222543141,0.384902178709387,0.00855224841369586,0.991447751586304,0.0171044968273917,0.974343254758912,0.342206418784293,0.632136835974619,0.525016092940563,0.107120743034056,163115,423783,0.0916497556406777,0.102314208864179,666232 +INF0614,9,Ctrl,2025-08-30,Female,HU,985816,886942,751813,687188,0.944112819199404,0.96687644404986,0.93044823924178,0.507858559795802,0.823181280160248,0.305544933078394,0.517636347081854,0.383501775471183,0.0226970560303894,0.977302943969611,0.0197293447293447,0.957573599240266,0.266927825261159,0.690645773979107,0.576155428933207,0.114490345045901,126360,329490,0.0331235559501405,0.0695517607582197,648783 +INF0622,0,Ctrl,2025-08-30,Male,HEU-lo,1419968,1254039,1116059,1024019,0.917274972437035,0.785139469843193,0.771036519476593,0.350359360677606,0.912788100700406,0.0960209058174691,0.816767194882937,0.492028137771768,0.0128146537881969,0.987185346211803,0.015544329438502,0.971641016773301,0.670499740619056,0.301141276154245,0.202070106963761,0.0990711691904844,161924,329095,0.214860530156807,0.228963480523407,939307 +INF0622,9,Ctrl,2025-08-30,Male,HEU-lo,918688,813691,633925,594892,0.95913207775529,0.997215114444951,0.975340881208595,0.762248939675418,0.933758541722232,0.252400419383616,0.681358122338615,0.669201975517562,0.00334304522903124,0.996656954770969,0.0180139631406072,0.978642991630362,0.721925978862884,0.256717012767478,0.199417973420557,0.0572990393469208,291052,434924,0.0027848855550493,0.0246591187914053,570580 +INF0627,9,Ctrl,2025-08-30,Female,HEU-hi,1040808,940435,782722,722083,0.842248051816758,0.987569326490982,0.956834650666833,0.52995447019187,0.823986050436855,0.177313964455917,0.646672085980937,0.593625893566322,0.00370567820705804,0.996294321792942,0.0216225539387857,0.974671767854156,0.711500669008195,0.263171098845961,0.229224159558455,0.0339469392875063,191328,322304,0.0124306735090179,0.0431653493331667,608173 +INF0614,0,PPD,2025-08-30,Female,HU,2167928,1927832,1630916,1508441,0.901599068177012,0.899544047134982,0.897743323757416,0.776620595893115,0.908680178487064,0.223675951112041,0.685004227375023,0.185058667254933,0.00546912171737584,0.994530878282624,0.017650579911082,0.976880298371542,0.527435140513964,0.449445157857578,0.392548897222464,0.0568962606351139,195461,1056211,0.100455952865018,0.102256676242584,1360009 +INF0614,4,PPD,2025-08-30,Female,HU,1324872,1244577,972809,876491,0.785615596737445,0.948302678681644,0.935248371660724,0.680051119324412,0.859840306829563,0.3080638858102,0.551776421019363,0.414792225902412,0.00831977594266768,0.991680224057332,0.0176383368685517,0.974041887188781,0.343659259869437,0.630382627319343,0.52646265367903,0.103919973640314,194236,468273,0.0516973213183558,0.0647516283392755,688585 +INF0614,9,PPD,2025-08-30,Female,HU,1181336,1066572,902472,813387,0.935030926238064,0.937837752550155,0.912820067793758,0.477232026633638,0.668151699246463,0.24215123086884,0.426000468377623,0.311675001033186,0.0230631872988932,0.976936812701107,0.0201813938686751,0.956755418832432,0.25828294614759,0.698472472684841,0.58343057176196,0.115041900922881,113124,362955,0.062162247449845,0.0871799322062424,760542 +INF0622,0,PPD,2025-08-30,Male,HEU-lo,1269256,1125016,972593,879358,0.920196325046227,0.800979260537184,0.785547627109847,0.413038105148162,0.886671473836331,0.082516762760193,0.804154711076138,0.486926393455866,0.0125105995993659,0.987489400400634,0.014691966425385,0.972797433975249,0.669956126875668,0.302841307099581,0.200796352508879,0.102044954590702,162742,334223,0.199020739462816,0.214452372890153,809182 +INF0622,4,PPD,2025-08-30,Male,HEU-lo,741976,658809,504597,468821,0.970803355651731,0.996280208202877,0.982264524875146,0.819419817943326,0.97596160291732,0.177267425491694,0.798694177425626,0.765994985855823,0.00438611844270042,0.9956138815573,0.0175059683415362,0.978107913215763,0.71630599914588,0.261801914069884,0.200399756365648,0.0614021577042363,285674,372945,0.00371979179712301,0.0177354751248536,455133 +INF0622,9,PPD,2025-08-30,Male,HEU-lo,954616,852281,660431,621750,0.931760353839968,0.996385429864566,0.974601344330096,0.757045304683751,0.935292414261708,0.259471057269827,0.675821356991881,0.664087848545168,0.00325149098200521,0.996748509017995,0.0171123875969525,0.979636121421042,0.720845593663198,0.258790527757845,0.200030214488534,0.0587603132693107,291251,438573,0.0036145701354342,0.0253986556699037,579322 +INF0627,4,PPD,2025-08-30,Female,HEU-hi,1274376,1221638,990572,930591,0.858136388596064,0.979495951533609,0.966596708633139,0.547259239594577,0.906030977491093,0.356671326943187,0.549359650547907,0.521679438570157,0.00289050300893029,0.99710949699107,0.0154043195255891,0.981705177465481,0.796094531291121,0.18561064617436,0.150854430934961,0.0347562152393986,227988,437027,0.0205040484663913,0.0334032913668614,798574 +INF0627,9,PPD,2025-08-30,Female,HEU-hi,976928,872861,706543,648987,0.869935761425113,0.991138498380203,0.960790113660316,0.559101769997715,0.856188382289581,0.187127759332945,0.669060622956636,0.615128494310262,0.0036360078076315,0.996363992192368,0.0211568272999294,0.975207164892439,0.712137364872868,0.263069800019571,0.228496824930859,0.0345729750887114,194169,315656,0.00886150161979682,0.0392098863396844,564577 +INF0614,0,SEB,2025-08-30,Female,HU,2404768,2139021,1869790,1725277,0.909617991777552,0.851620710067844,0.849870933250411,0.716843927681839,0.850154759132211,0.209923073777705,0.640231685354506,0.167388757429061,0.00548038320198823,0.994519616798012,0.013132739979183,0.981386876818829,0.510089852794358,0.471297024024471,0.398103107674661,0.0731939163498099,188308,1124974,0.148379289932156,0.150129066749589,1569343 +INF0622,0,SEB,2025-08-30,Male,HEU-lo,1313704,1154243,1022408,932997,0.914149777544837,0.799174345379699,0.783710615207662,0.37059135958654,0.884101026015813,0.0979349968520329,0.78616602916378,0.508100874154083,0.0129515127740521,0.987048487225948,0.0107846250599319,0.976263862166016,0.655259372723367,0.321004489442649,0.203008736044434,0.117995753398215,160599,316077,0.200825654620301,0.216289384792338,852899 +INF0622,9,SEB,2025-08-30,Male,HEU-lo,611904,549416,424379,399846,0.9352450693517,0.997323200179701,0.976015766645095,0.781454403482781,0.95273211328141,0.290235706366262,0.662496406915148,0.649376514228616,0.00375725893995763,0.996242741060042,0.0132004679447319,0.98304227311531,0.715407396477767,0.267634876637543,0.205200088530084,0.0624347881074587,189766,292228,0.00267679982029878,0.0239842333549046,373954 +INF0627,9,SEB,2025-08-30,Female,HEU-hi,688488,616891,512153,475077,0.865657567089124,0.992228647016199,0.958218035569259,0.557577555476664,0.834356711119639,0.198455339153794,0.635901371965845,0.586578632918458,0.00385112931765126,0.996148870682349,0.00725618188036221,0.988892688801987,0.690489643584673,0.298403045217314,0.256196749587379,0.0422062956299347,134506,229306,0.00777135298380072,0.0417819644307411,411254 diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/data/rounded.csv b/course/04_IntroToTidyverse/homeworks/claude-chew/data/rounded.csv new file mode 100644 index 0000000..96bb9ac --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/data/rounded.csv @@ -0,0 +1,197 @@ +"","bid","timepoint","Condition","Date","infant_sex","ptype","root","singletsFSC","singletsSSC","singletsSSCB","CD45","NotMonocytes","nonDebris","lymphocytes","live","Dump+","Dump-","Tcells","Vd2+","Vd2-","Va7.2+","Va7.2-","CD4+","CD4-","CD8+","CD8-","Tcells_count","lymphocytes_count","Monocytes","Debris","CD45_count" +"1","INF0052",0,"Ctrl","2025-07-26","Male","HEU-hi",2098368,1894070,1666179,1537396,0.6,0.88,0.86,0.64,0.9,0.21,0.69,0.28,0.01,0.99,0.01,0.98,0.63,0.34,0.27,0.07,164771,587573,0.12,0.14,915203 +"2","INF0100",0,"Ctrl","2025-07-26","Male","HEU-lo",2020184,1791890,1697083,1579098,0.91,0.91,0.86,0.21,0.89,0.06,0.83,0.67,0.01,0.99,0.02,0.98,0.61,0.37,0.34,0.03,208241,308583,0.09,0.14,1438047 +"3","INF0100",4,"Ctrl","2025-07-26","Male","HEU-lo",1155040,1033320,875465,845446,0.97,0.98,0.96,0.74,0.88,0.2,0.68,0.61,0,1,0.02,0.98,0.66,0.32,0.29,0.03,371723,607477,0.02,0.04,820570 +"4","INF0100",9,"Ctrl","2025-07-26","Male","HEU-lo",358624,328624,289327,276289,0.98,0.99,0.94,0.65,0.92,0.21,0.7,0.63,0.01,0.99,0.02,0.97,0.44,0.53,0.49,0.05,111552,176662,0.01,0.06,271304 +"5","INF0179",0,"Ctrl","2025-07-26","Male","HU",1362216,1206309,1032946,982736,0.96,0.96,0.84,0.71,0.9,0.34,0.56,0.44,0,1,0.01,0.98,0.74,0.24,0.2,0.05,291777,663667,0.04,0.16,940733 +"6","INF0179",4,"Ctrl","2025-07-26","Male","HU",1044808,917398,735579,685592,0.99,0.96,0.95,0.76,0.97,0.37,0.6,0.53,0.01,0.99,0.01,0.98,0.59,0.39,0.36,0.04,271870,510730,0.04,0.05,675857 +"7","INF0179",9,"Ctrl","2025-07-26","Male","HU",1434840,1265022,988445,940454,0.98,0.98,0.97,0.79,0.93,0.24,0.69,0.67,0,1,0.01,0.98,0.7,0.28,0.26,0.03,487937,726238,0.02,0.03,921660 +"8","INF0186",4,"Ctrl","2025-07-26","Female","HEU-hi",972056,875707,767323,718000,0.98,0.95,0.92,0.64,0.88,0.33,0.55,0.49,0.01,0.99,0.04,0.95,0.57,0.38,0.36,0.02,220634,451047,0.05,0.08,701657 +"9","INF0186",9,"Ctrl","2025-07-26","Female","HEU-hi",1521928,1359574,1175755,1097478,0.97,0.96,0.92,0.67,0.87,0.23,0.65,0.58,0.02,0.98,0.04,0.95,0.51,0.43,0.41,0.02,415867,710964,0.04,0.08,1066884 +"10","INF0052",0,"PPD","2025-07-26","Male","HEU-hi",2363512,2136616,1875394,1732620,0.59,0.86,0.84,0.64,0.9,0.21,0.69,0.28,0.01,0.99,0.02,0.98,0.63,0.34,0.27,0.07,184930,652155,0.14,0.16,1017713 +"11","INF0100",0,"PPD","2025-07-26","Male","HEU-lo",2049112,1821676,1717636,1597085,0.91,0.93,0.88,0.22,0.89,0.06,0.83,0.67,0.01,0.99,0.02,0.98,0.61,0.36,0.33,0.03,211987,314717,0.07,0.12,1447451 +"12","INF0100",4,"PPD","2025-07-26","Male","HEU-lo",1063496,946587,796056,767297,0.97,0.98,0.96,0.73,0.88,0.21,0.67,0.6,0.01,0.99,0.02,0.98,0.66,0.32,0.29,0.03,326378,544883,0.02,0.04,745037 +"13","INF0100",9,"PPD","2025-07-26","Male","HEU-lo",788368,714198,626387,600011,0.98,0.98,0.81,0.62,0.96,0.23,0.73,0.65,0.01,0.99,0.02,0.97,0.43,0.54,0.49,0.05,238021,366784,0.02,0.19,589379 +"14","INF0179",0,"PPD","2025-07-26","Male","HU",1380336,1242311,1047081,1000877,0.95,0.96,0.91,0.7,0.89,0.33,0.55,0.44,0,1,0.01,0.98,0.75,0.23,0.19,0.05,294549,663169,0.04,0.09,947858 +"15","INF0179",4,"PPD","2025-07-26","Male","HU",1240984,1089933,868877,814909,0.99,0.95,0.94,0.73,0.96,0.34,0.62,0.57,0,1,0.01,0.98,0.63,0.35,0.32,0.03,331680,586561,0.05,0.06,803170 +"16","INF0179",9,"PPD","2025-07-26","Male","HU",1705960,1492142,1163543,1107878,0.98,0.98,0.97,0.79,0.93,0.25,0.69,0.67,0,1,0.01,0.98,0.7,0.28,0.26,0.03,577228,863168,0.02,0.03,1088038 +"17","INF0186",4,"PPD","2025-07-26","Female","HEU-hi",848584,759606,648405,607514,0.98,0.95,0.93,0.67,0.86,0.33,0.54,0.48,0.01,0.99,0.04,0.95,0.53,0.42,0.39,0.02,190855,401148,0.05,0.07,596869 +"18","INF0186",9,"PPD","2025-07-26","Female","HEU-hi",1425416,1259825,1089955,1014266,0.98,0.96,0.91,0.63,0.88,0.24,0.64,0.58,0.02,0.98,0.04,0.94,0.5,0.44,0.42,0.02,365177,627601,0.04,0.09,991089 +"19","INF0052",0,"SEB","2025-07-26","Male","HEU-hi",2523776,2282292,2041563,1889418,0.58,0.89,0.87,0.67,0.91,0.23,0.68,0.27,0.01,0.99,0.01,0.98,0.61,0.37,0.28,0.09,201287,734179,0.11,0.13,1092762 +"20","INF0100",0,"SEB","2025-07-26","Male","HEU-lo",1900240,1685653,1598641,1488015,0.91,0.9,0.86,0.22,0.89,0.09,0.8,0.65,0.01,0.99,0.01,0.98,0.61,0.37,0.34,0.04,191734,294631,0.1,0.14,1355873 +"21","INF0100",4,"SEB","2025-07-26","Male","HEU-lo",1009776,900919,761137,732910,0.97,0.98,0.95,0.72,0.88,0.21,0.66,0.59,0,1,0.01,0.99,0.64,0.35,0.31,0.04,306146,514635,0.02,0.05,710627 +"22","INF0179",0,"SEB","2025-07-26","Male","HU",783096,710001,604070,579147,0.97,0.97,0.89,0.78,0.93,0.35,0.58,0.48,0,1,0.01,0.99,0.73,0.26,0.19,0.08,209429,435967,0.03,0.11,559571 +"23","INF0179",4,"SEB","2025-07-26","Male","HU",985280,860127,686367,640888,0.98,0.95,0.93,0.76,0.93,0.33,0.59,0.52,0,1,0.01,0.99,0.56,0.43,0.38,0.05,248274,477989,0.05,0.07,630736 +"24","INF0179",9,"SEB","2025-07-26","Male","HU",1111728,981610,783127,748455,0.98,0.98,0.97,0.82,0.94,0.26,0.67,0.65,0,1,0.01,0.99,0.7,0.29,0.26,0.04,393236,603182,0.02,0.03,736721 +"25","INF0186",4,"SEB","2025-07-26","Female","HEU-hi",492984,443892,386199,365672,0.98,0.98,0.94,0.68,0.86,0.33,0.53,0.47,0.01,0.99,0.01,0.98,0.5,0.47,0.45,0.03,114547,243342,0.02,0.06,358399 +"26","INF0186",9,"SEB","2025-07-26","Female","HEU-hi",1226128,1088491,957607,891839,0.97,0.96,0.91,0.6,0.87,0.23,0.64,0.57,0.02,0.98,0.01,0.97,0.48,0.49,0.46,0.03,300825,523938,0.04,0.09,866212 +"27","INF0134",0,"Ctrl","2025-07-29","Female","HEU-lo",1205504,1088093,965389,876164,0.79,0.8,0.78,0.58,0.88,0.16,0.72,0.32,0.01,0.99,0.03,0.97,0.7,0.27,0.23,0.04,127866,398139,0.2,0.22,689676 +"28","INF0134",4,"Ctrl","2025-07-29","Female","HEU-lo",1277824,1143114,940824,904464,0.98,0.98,0.96,0.78,0.94,0.32,0.62,0.51,0.01,0.99,0.03,0.96,0.64,0.33,0.28,0.05,351750,688123,0.02,0.04,887463 +"29","INF0134",9,"Ctrl","2025-07-29","Female","HEU-lo",424520,386914,358089,331672,0.96,0.97,0.9,0.43,0.82,0.12,0.7,0.54,0.03,0.97,0.03,0.94,0.46,0.48,0.42,0.06,72759,135812,0.03,0.1,317496 +"30","INF0148",0,"Ctrl","2025-07-29","Female","HU",2034128,1833204,1602246,1509990,0.67,0.92,0.9,0.65,0.88,0.22,0.66,0.36,0,1,0.02,0.98,0.67,0.31,0.27,0.04,234335,656943,0.08,0.1,1013985 +"31","INF0148",9,"Ctrl","2025-07-29","Female","HU",872400,793908,670148,623296,0.98,0.98,0.95,0.61,0.97,0.21,0.76,0.73,0.01,0.99,0.02,0.97,0.55,0.42,0.36,0.05,272412,374089,0.02,0.05,612630 +"32","INF0191",0,"Ctrl","2025-07-29","Female","HEU-hi",1997680,1808121,1593734,1482293,0.48,0.87,0.85,0.58,0.82,0.2,0.62,0.13,0.04,0.96,0.02,0.94,0.46,0.49,0.38,0.11,55780,413883,0.13,0.15,715443 +"33","INF0191",4,"Ctrl","2025-07-29","Female","HEU-hi",644496,572957,458792,438631,0.97,0.98,0.95,0.79,0.96,0.24,0.72,0.67,0.01,0.99,0.02,0.98,0.67,0.31,0.22,0.09,227949,338913,0.02,0.05,427368 +"34","INF0191",9,"Ctrl","2025-07-29","Female","HEU-hi",1504536,1353339,1109880,1047290,0.95,0.97,0.95,0.69,0.94,0.39,0.54,0.42,0.02,0.98,0.01,0.96,0.57,0.39,0.26,0.13,287885,693271,0.03,0.05,999587 +"35","INF0134",0,"PPD","2025-07-29","Female","HEU-lo",1245024,1126248,993895,896183,0.79,0.8,0.79,0.59,0.9,0.15,0.75,0.33,0.01,0.99,0.03,0.96,0.7,0.27,0.23,0.04,139312,420303,0.2,0.21,709388 +"36","INF0134",4,"PPD","2025-07-29","Female","HEU-lo",1340280,1201488,986763,947027,0.98,0.98,0.96,0.76,0.95,0.32,0.63,0.51,0.01,0.99,0.03,0.96,0.63,0.34,0.28,0.05,365074,711190,0.02,0.04,931169 +"37","INF0134",9,"PPD","2025-07-29","Female","HEU-lo",929672,828324,752940,697560,0.96,0.97,0.9,0.43,0.78,0.13,0.65,0.49,0.03,0.97,0.03,0.95,0.44,0.5,0.44,0.06,141471,288367,0.03,0.1,668644 +"38","INF0148",0,"PPD","2025-07-29","Female","HU",1862952,1676887,1450059,1372237,0.67,0.91,0.9,0.66,0.89,0.23,0.66,0.36,0,1,0.02,0.98,0.66,0.31,0.27,0.04,220142,609927,0.09,0.1,925793 +"39","INF0148",4,"PPD","2025-07-29","Female","HU",632312,562703,496868,467363,0.97,0.99,0.95,0.51,0.91,0.24,0.67,0.64,0,1,0.02,0.98,0.62,0.36,0.31,0.05,149173,233126,0.01,0.05,454573 +"40","INF0148",9,"PPD","2025-07-29","Female","HU",1110656,997595,827243,774214,0.98,0.98,0.95,0.65,0.96,0.2,0.76,0.73,0.01,0.99,0.02,0.97,0.56,0.41,0.36,0.05,363374,497273,0.02,0.05,759497 +"41","INF0191",0,"PPD","2025-07-29","Female","HEU-hi",1968064,1782256,1568308,1456260,0.49,0.88,0.86,0.58,0.8,0.2,0.6,0.13,0.04,0.96,0.02,0.94,0.45,0.49,0.38,0.11,53044,416511,0.12,0.14,712427 +"42","INF0191",4,"PPD","2025-07-29","Female","HEU-hi",1066672,941050,756678,723688,0.98,0.97,0.95,0.79,0.96,0.29,0.67,0.61,0.01,0.99,0.02,0.97,0.63,0.34,0.24,0.1,342753,563385,0.03,0.05,708666 +"43","INF0191",9,"PPD","2025-07-29","Female","HEU-hi",2415400,2151222,1768089,1652532,0.94,0.93,0.91,0.65,0.89,0.41,0.48,0.35,0.03,0.97,0.01,0.96,0.54,0.42,0.28,0.14,348982,1008178,0.07,0.09,1551941 +"44","INF0134",0,"SEB","2025-07-29","Female","HEU-lo",1193160,1079791,959139,869331,0.78,0.81,0.79,0.57,0.88,0.16,0.71,0.35,0.01,0.99,0.02,0.98,0.63,0.34,0.26,0.08,133436,385613,0.19,0.21,680674 +"45","INF0134",4,"SEB","2025-07-29","Female","HEU-lo",1291352,1157622,964426,923312,0.98,0.98,0.96,0.74,0.94,0.34,0.6,0.5,0.01,0.99,0.02,0.97,0.6,0.37,0.3,0.07,336815,671899,0.02,0.04,907293 +"46","INF0148",0,"SEB","2025-07-29","Female","HU",2042880,1841683,1602125,1513482,0.68,0.9,0.89,0.66,0.87,0.22,0.65,0.38,0,1,0.01,0.99,0.66,0.33,0.26,0.07,258231,674787,0.1,0.11,1029390 +"47","INF0191",0,"SEB","2025-07-29","Female","HEU-hi",1956304,1772838,1558215,1448120,0.5,0.87,0.86,0.58,0.81,0.21,0.61,0.15,0.03,0.97,0.01,0.95,0.46,0.49,0.37,0.12,65249,423955,0.13,0.14,724947 +"48","INF0191",9,"SEB","2025-07-29","Female","HEU-hi",1814944,1620273,1311159,1239312,0.96,0.95,0.94,0.69,0.92,0.41,0.5,0.38,0.02,0.98,0.01,0.97,0.55,0.42,0.27,0.15,311704,823331,0.05,0.06,1184775 +"49","INF0124",0,"Ctrl","2025-07-31","Male","HEU-hi",1229248,1096279,962417,891568,0.77,0.86,0.85,0.62,0.85,0.22,0.63,0.16,0.01,0.99,0.01,0.98,0.67,0.3,0.26,0.04,70297,426584,0.14,0.15,687720 +"50","INF0124",4,"Ctrl","2025-07-31","Male","HEU-hi",1105296,993220,820093,766344,0.9,0.95,0.94,0.7,0.91,0.26,0.65,0.48,0.01,0.99,0.01,0.98,0.51,0.47,0.42,0.05,230924,482090,0.05,0.06,689596 +"51","INF0124",9,"Ctrl","2025-07-31","Male","HEU-hi",1017128,915840,757350,701114,0.75,0.95,0.95,0.74,0.9,0.34,0.56,0.53,0,1,0.01,0.99,0.66,0.32,0.29,0.03,208211,389289,0.05,0.05,522851 +"52","INF0149",0,"Ctrl","2025-07-31","Female","HU",1327920,1192637,1046943,958252,0.9,0.89,0.87,0.54,0.84,0.16,0.68,0.23,0.02,0.98,0.02,0.96,0.62,0.34,0.3,0.04,107900,464503,0.11,0.13,857845 +"53","INF0149",4,"Ctrl","2025-07-31","Female","HU",1026960,910155,731344,694429,0.95,0.98,0.95,0.67,0.91,0.29,0.62,0.55,0.01,0.99,0.02,0.97,0.67,0.3,0.26,0.04,240028,439671,0.02,0.05,656832 +"54","INF0149",9,"Ctrl","2025-07-31","Female","HU",757368,665858,536020,502656,0.94,0.97,0.93,0.66,0.9,0.18,0.71,0.63,0.01,0.99,0.03,0.96,0.61,0.35,0.3,0.04,196467,310643,0.03,0.07,470072 +"55","INF0169",0,"Ctrl","2025-07-31","Female","HEU-lo",1288912,1144653,1051293,973587,0.88,0.84,0.83,0.35,0.77,0.13,0.64,0.25,0.01,0.99,0.02,0.97,0.75,0.23,0.14,0.09,75540,300763,0.16,0.17,854594 +"56","INF0169",4,"Ctrl","2025-07-31","Female","HEU-lo",1068232,944862,869444,785215,0.92,0.95,0.87,0.37,0.78,0.17,0.61,0.38,0.01,0.99,0.02,0.97,0.81,0.16,0.09,0.07,100425,264885,0.05,0.13,719400 +"57","INF0169",9,"Ctrl","2025-07-31","Female","HEU-lo",778672,685649,594814,542125,0.95,0.98,0.92,0.57,0.87,0.3,0.57,0.46,0.02,0.98,0.02,0.96,0.83,0.13,0.08,0.05,136465,295876,0.02,0.08,515731 +"58","INF0124",0,"PPD","2025-07-31","Male","HEU-hi",1246824,1108772,973652,900843,0.78,0.86,0.86,0.64,0.81,0.21,0.6,0.15,0.01,0.99,0.01,0.98,0.67,0.31,0.27,0.04,68997,452525,0.14,0.14,703680 +"59","INF0124",4,"PPD","2025-07-31","Male","HEU-hi",1515456,1357582,1150459,1069355,0.89,0.91,0.9,0.64,0.77,0.21,0.57,0.43,0.01,0.99,0.01,0.98,0.52,0.47,0.42,0.05,257077,604318,0.09,0.1,948655 +"60","INF0124",9,"PPD","2025-07-31","Male","HEU-hi",1583312,1418103,1190344,1093566,0.86,0.97,0.96,0.61,0.91,0.34,0.56,0.53,0,1,0.01,0.99,0.65,0.34,0.3,0.03,302779,570742,0.03,0.04,940348 +"61","INF0149",0,"PPD","2025-07-31","Female","HU",1153168,1032394,892184,812261,0.89,0.89,0.88,0.59,0.83,0.15,0.67,0.21,0.02,0.98,0.02,0.96,0.62,0.34,0.3,0.04,91782,430612,0.11,0.12,723885 +"62","INF0149",4,"PPD","2025-07-31","Female","HU",1238584,1092917,869629,826659,0.95,0.98,0.95,0.69,0.95,0.31,0.64,0.56,0.01,0.99,0.02,0.97,0.67,0.3,0.27,0.04,305179,540805,0.02,0.05,786174 +"63","INF0149",9,"PPD","2025-07-31","Female","HU",1216752,1066815,870494,816153,0.93,0.97,0.93,0.66,0.88,0.21,0.67,0.59,0.01,0.99,0.03,0.96,0.6,0.36,0.32,0.04,295443,503231,0.03,0.07,762707 +"64","INF0169",0,"PPD","2025-07-31","Female","HEU-lo",1218624,1082765,987457,903485,0.86,0.84,0.83,0.38,0.76,0.12,0.64,0.25,0.01,0.99,0.01,0.97,0.74,0.23,0.13,0.1,74296,297323,0.16,0.17,773674 +"65","INF0169",4,"PPD","2025-07-31","Female","HEU-lo",940776,820971,737842,662123,0.93,0.93,0.85,0.38,0.74,0.16,0.58,0.34,0.01,0.99,0.02,0.97,0.81,0.16,0.09,0.07,80159,234002,0.07,0.15,613226 +"66","INF0169",9,"PPD","2025-07-31","Female","HEU-lo",1054184,923351,814226,740463,0.94,0.96,0.9,0.52,0.79,0.26,0.52,0.42,0.02,0.98,0.02,0.96,0.83,0.13,0.08,0.05,150495,361396,0.04,0.1,696984 +"67","INF0124",0,"SEB","2025-07-31","Male","HEU-hi",1004008,900404,794342,737214,0.82,0.86,0.85,0.65,0.91,0.24,0.66,0.18,0.01,0.99,0.01,0.98,0.66,0.32,0.26,0.07,69374,388022,0.14,0.15,601085 +"68","INF0124",4,"SEB","2025-07-31","Male","HEU-hi",1571248,1425147,1204162,1120656,0.88,0.9,0.89,0.64,0.78,0.24,0.54,0.41,0.01,0.99,0,0.99,0.49,0.5,0.45,0.06,255776,627446,0.1,0.11,985662 +"69","INF0124",9,"SEB","2025-07-31","Male","HEU-hi",1109328,998592,812606,756059,0.9,0.97,0.95,0.66,0.9,0.37,0.54,0.51,0,1,0.01,0.99,0.66,0.33,0.29,0.04,229141,448918,0.03,0.05,684063 +"70","INF0149",0,"SEB","2025-07-31","Female","HU",1225472,1099942,970297,887529,0.9,0.88,0.86,0.54,0.8,0.16,0.64,0.22,0.02,0.98,0.01,0.97,0.58,0.39,0.32,0.07,92992,425421,0.12,0.14,795067 +"71","INF0149",4,"SEB","2025-07-31","Female","HU",1124960,999291,795445,758864,0.95,0.98,0.96,0.71,0.92,0.33,0.59,0.52,0.01,0.99,0.01,0.98,0.66,0.32,0.28,0.04,267164,510687,0.02,0.04,717901 +"72","INF0149",9,"SEB","2025-07-31","Female","HU",531432,467288,379931,358096,0.92,0.97,0.93,0.65,0.9,0.26,0.64,0.55,0.01,0.99,0.02,0.97,0.57,0.4,0.35,0.05,119060,215587,0.03,0.07,330943 +"73","INF0169",0,"SEB","2025-07-31","Female","HEU-lo",1237144,1103284,1012883,939441,0.88,0.84,0.83,0.36,0.77,0.14,0.64,0.27,0.01,0.99,0.01,0.98,0.72,0.26,0.14,0.12,78269,295039,0.16,0.17,823307 +"74","INF0169",4,"SEB","2025-07-31","Female","HEU-lo",698912,617805,566286,511948,0.92,0.93,0.85,0.38,0.73,0.17,0.56,0.33,0.01,0.99,0.01,0.98,0.8,0.18,0.1,0.08,59866,179819,0.07,0.15,471854 +"75","INF0169",9,"SEB","2025-07-31","Female","HEU-lo",887744,782828,694751,633595,0.94,0.96,0.91,0.52,0.77,0.26,0.51,0.41,0.02,0.98,0.01,0.97,0.83,0.13,0.08,0.06,125813,309285,0.04,0.09,594438 +"76","INF0019",0,"Ctrl","2025-08-05","Female","HEU-lo",1324344,1197859,1022143,939295,0.93,0.87,0.86,0.69,0.92,0.1,0.82,0.35,0.01,0.99,0.01,0.98,0.73,0.24,0.22,0.02,208055,602942,0.13,0.14,873622 +"77","INF0019",4,"Ctrl","2025-08-05","Female","HEU-lo",1244280,1117290,891334,840761,0.91,0.96,0.94,0.7,0.89,0.35,0.53,0.45,0,1,0.01,0.98,0.65,0.33,0.29,0.04,242421,536628,0.04,0.06,761206 +"78","INF0019",9,"Ctrl","2025-08-05","Female","HEU-lo",1844096,1632745,1274587,1217805,0.93,0.96,0.96,0.79,0.94,0.21,0.73,0.7,0,1,0.02,0.98,0.7,0.28,0.26,0.02,632492,899242,0.04,0.04,1132950 +"79","INF0032",0,"Ctrl","2025-08-05","Female","HU",1124480,1006880,824473,773851,0.97,0.94,0.94,0.81,0.98,0.19,0.79,0.59,0.01,0.99,0.02,0.98,0.71,0.26,0.24,0.03,361034,612809,0.06,0.06,753064 +"80","INF0032",4,"Ctrl","2025-08-05","Female","HU",711784,637561,497456,468981,0.97,0.94,0.93,0.81,0.94,0.36,0.58,0.43,0.01,0.99,0.01,0.98,0.68,0.3,0.22,0.08,159481,369279,0.06,0.07,454567 +"81","INF0032",9,"Ctrl","2025-08-05","Female","HU",1248456,1118033,911093,872062,0.98,0.97,0.97,0.78,0.96,0.26,0.7,0.66,0.02,0.98,0.02,0.96,0.71,0.26,0.22,0.03,445087,673594,0.03,0.03,858876 +"82","INF0180",0,"Ctrl","2025-08-05","Male","HEU-hi",1614504,1435508,1209469,1117422,0.94,0.87,0.86,0.7,0.93,0.11,0.82,0.39,0,1,0.02,0.98,0.66,0.31,0.3,0.02,284958,734694,0.13,0.14,1049663 +"83","INF0180",4,"Ctrl","2025-08-05","Male","HEU-hi",528392,465660,387783,356166,0.99,0.92,0.9,0.64,0.98,0.21,0.77,0.57,0.01,0.99,0.01,0.97,0.52,0.45,0.37,0.08,129092,225837,0.08,0.1,351222 +"84","INF0019",0,"PPD","2025-08-05","Female","HEU-lo",1271392,1149523,966376,895883,0.93,0.91,0.91,0.72,0.94,0.1,0.84,0.36,0.01,0.99,0.01,0.98,0.74,0.24,0.22,0.02,216135,602680,0.09,0.09,834677 +"85","INF0019",4,"PPD","2025-08-05","Female","HEU-lo",1374576,1213048,954728,905952,0.93,0.96,0.94,0.72,0.89,0.36,0.53,0.45,0,1,0.01,0.98,0.66,0.32,0.29,0.03,270713,602258,0.04,0.06,841834 +"86","INF0019",9,"PPD","2025-08-05","Female","HEU-lo",1725968,1521365,1188395,1141230,0.94,0.97,0.97,0.81,0.96,0.22,0.74,0.72,0,1,0.02,0.98,0.7,0.28,0.26,0.02,624909,871175,0.03,0.03,1071855 +"87","INF0032",0,"PPD","2025-08-05","Female","HU",1240368,1107613,907113,859658,0.98,0.92,0.91,0.7,0.98,0.17,0.81,0.67,0.01,0.99,0.01,0.98,0.72,0.26,0.23,0.03,393929,586509,0.08,0.09,839233 +"88","INF0032",4,"PPD","2025-08-05","Female","HU",774384,688988,533872,502702,0.96,0.94,0.93,0.81,0.96,0.36,0.6,0.45,0.01,0.99,0.01,0.97,0.68,0.29,0.22,0.08,176652,392277,0.06,0.07,484001 +"89","INF0032",9,"PPD","2025-08-05","Female","HU",1335992,1193171,967189,926155,0.99,0.97,0.96,0.78,0.95,0.26,0.7,0.65,0.02,0.98,0.02,0.96,0.71,0.26,0.22,0.03,463605,709643,0.03,0.04,912641 +"90","INF0180",0,"PPD","2025-08-05","Male","HEU-hi",1570368,1398767,1158451,1068711,0.94,0.9,0.89,0.71,0.93,0.11,0.82,0.41,0,1,0.02,0.98,0.66,0.32,0.3,0.02,291504,714849,0.1,0.11,1007435 +"91","INF0180",4,"PPD","2025-08-05","Male","HEU-hi",638600,551845,454723,419608,0.99,0.94,0.91,0.63,0.98,0.2,0.78,0.59,0.01,0.99,0.01,0.97,0.52,0.45,0.38,0.08,155999,262463,0.06,0.09,415352 +"92","INF0180",9,"PPD","2025-08-05","Male","HEU-hi",1516936,1391367,1205249,1116976,0.58,0.86,0.85,0.62,0.7,0.11,0.59,0.43,0.02,0.98,0.02,0.97,0.3,0.67,0.59,0.08,174611,401702,0.14,0.15,648628 +"93","INF0019",0,"SEB","2025-08-05","Female","HEU-lo",1353632,1227164,1049849,966363,0.93,0.87,0.87,0.7,0.92,0.1,0.82,0.36,0.01,0.99,0.01,0.98,0.7,0.28,0.23,0.05,226668,630830,0.13,0.13,900030 +"94","INF0019",4,"SEB","2025-08-05","Female","HEU-lo",1170048,1047919,832442,792400,0.92,0.96,0.94,0.72,0.9,0.34,0.56,0.48,0,1,0.01,0.99,0.63,0.36,0.32,0.04,254381,525577,0.04,0.06,726812 +"95","INF0019",9,"SEB","2025-08-05","Female","HEU-lo",1710322,1517501,1200599,1151235,0.93,0.97,0.96,0.81,0.95,0.21,0.74,0.71,0,1,0.01,0.99,0.69,0.29,0.27,0.02,611507,859276,0.03,0.04,1065400 +"96","INF0032",0,"SEB","2025-08-05","Female","HU",1027392,922706,754901,711686,0.98,0.96,0.95,0.84,0.99,0.23,0.77,0.58,0.01,0.99,0.01,0.98,0.69,0.3,0.25,0.04,333941,579843,0.04,0.05,694403 +"97","INF0032",9,"SEB","2025-08-05","Female","HU",1155456,1036243,850931,814746,0.99,0.97,0.96,0.79,0.96,0.26,0.7,0.66,0.02,0.98,0.01,0.97,0.71,0.26,0.22,0.04,416016,632145,0.03,0.04,804398 +"98","INF0180",0,"SEB","2025-08-05","Male","HEU-hi",1661856,1483795,1251178,1155566,0.95,0.88,0.87,0.7,0.92,0.12,0.8,0.4,0,1,0.01,0.99,0.61,0.37,0.31,0.06,307489,763986,0.12,0.13,1092013 +"99","INF0155",0,"Ctrl","2025-08-07","Female","HEU-lo",1956872,1761294,1560508,1450803,0.73,0.86,0.85,0.71,0.83,0.24,0.58,0.38,0.01,0.99,0.01,0.98,0.7,0.28,0.23,0.05,281626,750862,0.14,0.15,1065048 +"100","INF0155",4,"Ctrl","2025-08-07","Female","HEU-lo",1215184,1083687,851644,825005,0.98,0.99,0.98,0.85,0.97,0.34,0.63,0.6,0,1,0.01,0.99,0.72,0.26,0.22,0.04,412580,693213,0.01,0.02,811417 +"101","INF0155",9,"Ctrl","2025-08-07","Female","HEU-lo",1123680,1000603,815357,761574,0.98,0.96,0.93,0.62,0.93,0.32,0.61,0.5,0.01,0.99,0.01,0.98,0.5,0.48,0.4,0.08,228822,461857,0.04,0.07,747029 +"102","INF0158",0,"Ctrl","2025-08-07","Male","HU",1974064,1742021,1484261,1352364,0.92,0.8,0.79,0.61,0.93,0.33,0.6,0.37,0,1,0.02,0.97,0.59,0.38,0.36,0.02,280913,766092,0.2,0.21,1249338 +"103","INF0158",4,"Ctrl","2025-08-07","Male","HU",1017536,914368,805877,754118,0.95,0.97,0.92,0.57,0.83,0.59,0.23,0.2,0.01,0.99,0.02,0.97,0.57,0.4,0.37,0.03,79380,403772,0.03,0.08,714462 +"104","INF0158",9,"Ctrl","2025-08-07","Male","HU",1148432,1020361,904910,847242,0.96,0.96,0.91,0.57,0.8,0.32,0.48,0.43,0.01,0.99,0.02,0.97,0.51,0.46,0.43,0.03,199112,458838,0.04,0.09,810976 +"105","INF0159",0,"Ctrl","2025-08-07","Male","HEU-hi",2024024,1786795,1447822,1277260,0.93,0.82,0.81,0.65,0.95,0.16,0.78,0.58,0.01,0.99,0.02,0.97,0.72,0.25,0.22,0.03,452551,775338,0.18,0.19,1190219 +"106","INF0159",4,"Ctrl","2025-08-07","Male","HEU-hi",1487344,1333646,1131385,1067284,0.94,0.98,0.94,0.65,0.76,0.26,0.49,0.43,0.01,0.99,0.02,0.96,0.49,0.47,0.39,0.08,275733,648745,0.02,0.06,1003414 +"107","INF0159",9,"Ctrl","2025-08-07","Male","HEU-hi",1167840,1028158,742821,709883,0.98,0.99,0.97,0.81,0.92,0.05,0.87,0.86,0,1,0.03,0.97,0.63,0.34,0.33,0.01,487443,567733,0.01,0.03,697474 +"108","INF0155",0,"PPD","2025-08-07","Female","HEU-lo",2221632,2004398,1728584,1609792,0.78,0.9,0.88,0.76,0.93,0.27,0.66,0.43,0.01,0.99,0.01,0.98,0.69,0.29,0.23,0.05,412907,962370,0.1,0.12,1262810 +"109","INF0155",4,"PPD","2025-08-07","Female","HEU-lo",1393256,1237743,976719,947853,0.99,0.99,0.98,0.86,0.96,0.34,0.62,0.59,0,1,0.01,0.99,0.72,0.27,0.23,0.04,473057,801339,0.01,0.02,935619 +"110","INF0155",9,"PPD","2025-08-07","Female","HEU-lo",1302344,1145745,915824,856281,0.98,0.96,0.93,0.65,0.97,0.34,0.63,0.5,0.01,0.99,0.01,0.98,0.5,0.48,0.41,0.07,273995,547508,0.04,0.07,839902 +"111","INF0158",0,"PPD","2025-08-07","Male","HU",1897704,1691391,1435638,1304624,0.92,0.85,0.84,0.66,0.9,0.3,0.6,0.38,0,1,0.02,0.97,0.6,0.37,0.35,0.02,300921,790739,0.15,0.16,1203885 +"112","INF0158",4,"PPD","2025-08-07","Male","HU",1229864,1101656,968001,903455,0.94,0.97,0.92,0.53,0.85,0.6,0.25,0.21,0.01,0.99,0.01,0.97,0.56,0.41,0.38,0.03,92726,450635,0.03,0.08,853125 +"113","INF0158",9,"PPD","2025-08-07","Male","HU",1371136,1216419,1068812,1005622,0.95,0.97,0.92,0.59,0.84,0.35,0.5,0.45,0.01,0.99,0.02,0.97,0.51,0.46,0.43,0.03,257109,566004,0.03,0.08,954296 +"114","INF0159",0,"PPD","2025-08-07","Male","HEU-hi",1898040,1677926,1357904,1200314,0.93,0.84,0.83,0.66,0.95,0.17,0.78,0.59,0,1,0.02,0.97,0.72,0.25,0.22,0.03,435293,739297,0.16,0.17,1112879 +"115","INF0159",4,"PPD","2025-08-07","Male","HEU-hi",1468272,1314327,1118313,1054808,0.95,0.98,0.94,0.63,0.82,0.31,0.51,0.44,0.01,0.99,0.02,0.96,0.48,0.48,0.4,0.08,277402,632369,0.02,0.06,998207 +"116","INF0159",9,"PPD","2025-08-07","Male","HEU-hi",1124616,979389,693430,664229,0.99,0.99,0.97,0.83,0.95,0.08,0.88,0.87,0,1,0.03,0.97,0.63,0.34,0.33,0.01,473302,546835,0.01,0.03,655255 +"117","INF0155",0,"SEB","2025-08-07","Female","HEU-lo",2378848,2136279,1866817,1735030,0.77,0.87,0.85,0.73,0.92,0.27,0.65,0.43,0.01,0.99,0.01,0.98,0.68,0.3,0.23,0.06,413420,967587,0.13,0.15,1332783 +"118","INF0155",4,"SEB","2025-08-07","Female","HEU-lo",995464,892094,720248,700245,0.99,0.99,0.98,0.85,0.96,0.34,0.61,0.56,0,1,0.01,0.99,0.7,0.29,0.24,0.05,332018,589367,0.01,0.02,691118 +"119","INF0158",0,"SEB","2025-08-07","Male","HU",1995888,1767501,1513529,1376026,0.93,0.81,0.8,0.62,0.89,0.32,0.57,0.35,0,1,0.01,0.98,0.59,0.39,0.36,0.04,276075,788314,0.19,0.2,1275881 +"120","INF0158",4,"SEB","2025-08-07","Male","HU",1006016,899118,788056,735913,0.95,0.97,0.92,0.55,0.81,0.57,0.24,0.2,0.01,0.99,0.01,0.98,0.54,0.44,0.41,0.04,77862,387150,0.03,0.08,699492 +"121","INF0158",9,"SEB","2025-08-07","Male","HU",1120552,994396,877895,829211,0.95,0.97,0.92,0.59,0.77,0.29,0.48,0.44,0.01,0.99,0.01,0.98,0.5,0.48,0.44,0.03,203043,465454,0.03,0.08,788745 +"122","INF0159",0,"SEB","2025-08-07","Male","HEU-hi",2086792,1847605,1507051,1327409,0.93,0.82,0.81,0.64,0.93,0.17,0.76,0.57,0,1,0.01,0.98,0.71,0.27,0.23,0.04,449101,783347,0.18,0.19,1233616 +"123","INF0159",4,"SEB","2025-08-07","Male","HEU-hi",1459280,1303303,1109557,1042434,0.94,0.98,0.94,0.63,0.81,0.29,0.52,0.45,0.01,0.99,0.02,0.97,0.47,0.5,0.42,0.08,277396,621671,0.02,0.06,980926 +"124","INF0159",9,"SEB","2025-08-07","Male","HEU-hi",527136,464846,340607,329303,0.99,0.99,0.98,0.81,0.91,0.1,0.81,0.79,0,1,0.02,0.98,0.61,0.37,0.35,0.02,208960,264053,0.01,0.02,325961 +"125","INF0013",0,"Ctrl","2025-08-22","Male","HEU-lo",1284824,1149119,931095,865836,0.97,0.93,0.92,0.75,0.95,0.09,0.86,0.29,0.01,0.99,0.01,0.98,0.85,0.13,0.12,0.01,182751,627784,0.07,0.08,836573 +"126","INF0013",4,"Ctrl","2025-08-22","Male","HEU-lo",1212080,1066572,933636,828526,0.95,0.85,0.83,0.6,0.93,0.15,0.78,0.59,0.01,0.99,0.01,0.98,0.53,0.45,0.12,0.32,281544,473664,0.15,0.17,788604 +"127","INF0013",9,"Ctrl","2025-08-22","Male","HEU-lo",591208,513249,411678,387329,0.98,0.98,0.96,0.74,0.98,0.22,0.76,0.74,0,1,0.01,0.99,0.63,0.35,0.33,0.02,209346,282969,0.02,0.04,380430 +"128","INF0023",0,"Ctrl","2025-08-22","Female","HEU-hi",1428512,1282467,1103378,1007499,0.96,0.85,0.84,0.7,0.88,0.28,0.59,0.32,0.01,0.99,0.02,0.97,0.74,0.23,0.2,0.03,218435,680906,0.15,0.16,968035 +"129","INF0023",4,"Ctrl","2025-08-22","Female","HEU-hi",1945688,1737383,1389603,1347134,0.97,0.97,0.97,0.83,0.92,0.47,0.45,0.43,0,1,0.02,0.97,0.71,0.26,0.24,0.03,460826,1083175,0.03,0.03,1307804 +"130","INF0023",9,"Ctrl","2025-08-22","Female","HEU-hi",987800,871641,686162,661242,0.97,0.98,0.97,0.82,0.98,0.33,0.65,0.6,0,1,0.04,0.96,0.58,0.38,0.33,0.05,314132,525176,0.02,0.03,639892 +"131","INF0030",0,"Ctrl","2025-08-22","Male","HU",1055672,939062,820166,756891,0.97,0.96,0.94,0.55,0.89,0.21,0.67,0.21,0,1,0.02,0.98,0.65,0.33,0.3,0.02,85521,401205,0.04,0.06,732321 +"132","INF0030",4,"Ctrl","2025-08-22","Male","HU",887272,774792,587687,558971,0.96,0.97,0.96,0.82,0.97,0.34,0.62,0.59,0,1,0.02,0.97,0.61,0.37,0.3,0.07,258250,440126,0.03,0.04,536358 +"133","INF0030",9,"Ctrl","2025-08-22","Male","HU",1059640,929289,780683,761469,1,0.99,0.98,0.88,0.98,0.19,0.79,0.73,0,1,0.03,0.96,0.53,0.44,0.39,0.04,489165,668650,0.01,0.02,759205 +"134","INF0013",0,"PPD","2025-08-22","Male","HEU-lo",1309848,1169793,941515,876615,0.96,0.94,0.93,0.76,0.94,0.09,0.85,0.28,0.01,0.99,0.01,0.98,0.85,0.13,0.12,0.01,182108,640422,0.06,0.07,843590 +"135","INF0013",4,"PPD","2025-08-22","Male","HEU-lo",1021264,890816,775431,680459,0.9,0.85,0.83,0.53,0.91,0.13,0.78,0.58,0.01,0.99,0.01,0.98,0.56,0.41,0.36,0.05,189329,324923,0.15,0.17,615551 +"136","INF0013",9,"PPD","2025-08-22","Male","HEU-lo",739216,639880,503620,472587,0.98,0.98,0.96,0.75,0.98,0.2,0.77,0.75,0.01,0.99,0.01,0.98,0.62,0.36,0.34,0.03,261044,346934,0.02,0.04,464537 +"137","INF0023",0,"PPD","2025-08-22","Female","HEU-hi",1572088,1406726,1193232,1088074,0.96,0.86,0.86,0.72,0.87,0.28,0.59,0.29,0.01,0.99,0.02,0.97,0.73,0.24,0.2,0.03,222251,757525,0.14,0.14,1048767 +"138","INF0023",4,"PPD","2025-08-22","Female","HEU-hi",1960856,1733414,1389954,1349503,0.97,0.97,0.97,0.82,0.92,0.48,0.44,0.41,0,1,0.02,0.97,0.71,0.26,0.23,0.03,442707,1073086,0.03,0.03,1314066 +"139","INF0023",9,"PPD","2025-08-22","Female","HEU-hi",942384,831282,659209,636544,0.97,0.98,0.97,0.82,0.98,0.34,0.63,0.59,0,1,0.04,0.96,0.59,0.37,0.32,0.05,296169,503576,0.02,0.03,614541 +"140","INF0030",0,"PPD","2025-08-22","Male","HU",972560,864436,748225,696152,0.97,0.95,0.92,0.56,0.92,0.22,0.7,0.22,0,1,0.02,0.98,0.65,0.33,0.3,0.02,82658,380296,0.05,0.08,673857 +"141","INF0030",4,"PPD","2025-08-22","Male","HU",983584,844256,638719,608344,0.97,0.97,0.96,0.82,0.95,0.36,0.59,0.56,0.01,0.99,0.02,0.97,0.6,0.38,0.31,0.07,269391,485271,0.03,0.04,592064 +"142","INF0030",9,"PPD","2025-08-22","Male","HU",1369512,1205519,999002,973830,1,0.99,0.98,0.89,0.98,0.2,0.78,0.73,0,1,0.03,0.96,0.54,0.42,0.38,0.04,625597,862245,0.01,0.02,970490 +"143","INF0013",0,"SEB","2025-08-22","Male","HEU-lo",1304808,1167431,967694,900086,0.96,0.93,0.92,0.73,0.94,0.11,0.83,0.3,0.01,0.99,0.01,0.99,0.77,0.21,0.18,0.04,187955,634749,0.07,0.08,867533 +"144","INF0013",4,"SEB","2025-08-22","Male","HEU-lo",1108496,975841,843244,746237,0.88,0.88,0.87,0.52,0.9,0.12,0.77,0.61,0.01,0.99,0.01,0.98,0.53,0.46,0.4,0.05,205771,339517,0.12,0.13,653038 +"145","INF0013",9,"SEB","2025-08-22","Male","HEU-lo",338400,296428,235954,224609,0.97,0.99,0.96,0.78,0.98,0.22,0.76,0.75,0,1,0.01,0.99,0.63,0.36,0.34,0.03,127799,170847,0.01,0.04,218581 +"146","INF0023",0,"SEB","2025-08-22","Female","HEU-hi",1553624,1392141,1200738,1097477,0.96,0.84,0.84,0.7,0.87,0.3,0.57,0.33,0.01,0.99,0.01,0.98,0.66,0.32,0.23,0.09,245172,734030,0.16,0.16,1054847 +"147","INF0023",4,"SEB","2025-08-22","Female","HEU-hi",1938960,1727707,1390235,1352003,0.97,0.97,0.97,0.81,0.94,0.49,0.45,0.42,0,1,0.01,0.98,0.7,0.28,0.25,0.04,453500,1070908,0.03,0.03,1318180 +"148","INF0023",9,"SEB","2025-08-22","Female","HEU-hi",904872,793595,633506,611464,0.96,0.98,0.97,0.82,0.97,0.38,0.59,0.54,0,1,0.02,0.98,0.56,0.42,0.36,0.06,261350,480662,0.02,0.03,585400 +"149","INF0030",0,"SEB","2025-08-22","Male","HU",1039944,924772,816017,756973,0.97,0.96,0.94,0.54,0.89,0.23,0.66,0.22,0,1,0.01,0.99,0.61,0.38,0.33,0.05,87991,398086,0.04,0.06,732006 +"150","INF0030",4,"SEB","2025-08-22","Male","HU",776400,671086,524037,503966,0.97,0.98,0.97,0.85,0.98,0.4,0.58,0.55,0,1,0.01,0.98,0.59,0.39,0.32,0.07,229988,419154,0.02,0.03,490896 +"151","INF0030",9,"SEB","2025-08-22","Male","HU",1288944,1140767,954830,930021,1,0.99,0.98,0.88,0.98,0.22,0.77,0.72,0,1,0.02,0.98,0.54,0.44,0.39,0.05,583119,812850,0.01,0.02,926978 +"152","INF0166",0,"Ctrl","2025-08-28","Female","HU",1142328,1017218,889137,819646,0.9,0.9,0.89,0.62,0.76,0.07,0.69,0.49,0,1,0.01,0.99,0.84,0.14,0.14,0.01,225650,457739,0.1,0.11,739495 +"153","INF0166",4,"Ctrl","2025-08-28","Female","HU",910864,805652,630109,604513,0.99,0.98,0.96,0.8,0.94,0.41,0.53,0.49,0.01,0.99,0.01,0.98,0.67,0.31,0.26,0.05,231122,476245,0.02,0.04,598027 +"154","INF0166",9,"Ctrl","2025-08-28","Female","HU",1053896,933222,740554,713494,0.98,0.98,0.96,0.8,0.94,0.28,0.66,0.63,0.01,0.99,0.01,0.98,0.7,0.28,0.24,0.04,354348,560988,0.02,0.04,698484 +"155","INF0199",0,"Ctrl","2025-08-28","Male","HEU-hi",1729240,1545717,1379096,1282394,0.87,0.9,0.87,0.72,0.28,0.02,0.26,0.21,0.01,0.99,0.02,0.97,0.55,0.42,0.37,0.05,169736,797492,0.1,0.13,1112176 +"156","INF0199",4,"Ctrl","2025-08-28","Male","HEU-hi",955672,847071,733820,687490,0.93,0.93,0.9,0.57,0.83,0.23,0.59,0.52,0.02,0.98,0.01,0.97,0.29,0.68,0.53,0.15,188750,361676,0.07,0.1,639373 +"157","INF0199",9,"Ctrl","2025-08-28","Male","HEU-hi",1090984,980857,815737,784725,0.99,0.97,0.95,0.74,0.93,0.2,0.72,0.67,0.01,0.99,0.01,0.98,0.34,0.64,0.53,0.11,388336,575541,0.03,0.05,774996 +"158","INF0207",0,"Ctrl","2025-08-28","Male","HEU-lo",1373960,1231782,1089637,986621,0.92,0.64,0.63,0.39,0.92,0.34,0.58,0.11,0.03,0.97,0.02,0.96,0.65,0.31,0.25,0.06,39055,356852,0.36,0.37,905365 +"159","INF0207",4,"Ctrl","2025-08-28","Male","HEU-lo",864640,768455,603156,581744,0.99,0.97,0.96,0.82,0.97,0.49,0.48,0.37,0.01,0.99,0.02,0.97,0.45,0.52,0.45,0.07,174809,469311,0.03,0.04,573683 +"160","INF0207",9,"Ctrl","2025-08-28","Male","HEU-lo",1155280,1020738,803205,743244,0.98,0.97,0.95,0.78,0.97,0.32,0.65,0.6,0.01,0.99,0.02,0.98,0.7,0.27,0.24,0.04,341997,568106,0.03,0.05,729712 +"161","INF0166",0,"PPD","2025-08-28","Female","HU",1421024,1265409,1081320,999289,0.91,0.91,0.9,0.66,0.74,0.07,0.67,0.48,0,1,0.01,0.99,0.84,0.15,0.14,0.01,287341,604142,0.09,0.1,912401 +"162","INF0166",4,"PPD","2025-08-28","Female","HU",895072,775403,609274,585499,0.99,0.98,0.96,0.79,0.97,0.42,0.55,0.5,0.01,0.99,0.01,0.98,0.68,0.3,0.25,0.05,229479,460120,0.02,0.04,580022 +"163","INF0166",9,"PPD","2025-08-28","Female","HU",996616,876933,700861,676818,0.99,0.98,0.96,0.81,0.94,0.28,0.67,0.64,0.01,0.99,0.01,0.98,0.7,0.28,0.24,0.04,344436,539166,0.02,0.04,666724 +"164","INF0199",0,"PPD","2025-08-28","Male","HEU-hi",1516328,1353418,1204623,1122951,0.86,0.91,0.88,0.73,0.29,0.02,0.27,0.22,0.01,0.99,0.02,0.97,0.55,0.42,0.37,0.05,155310,697308,0.09,0.12,960247 +"165","INF0199",4,"PPD","2025-08-28","Male","HEU-hi",897696,790855,670560,632602,0.94,0.94,0.91,0.6,0.86,0.23,0.63,0.55,0.02,0.98,0.01,0.97,0.27,0.7,0.55,0.15,194829,355207,0.06,0.09,592802 +"166","INF0199",9,"PPD","2025-08-28","Male","HEU-hi",858968,768197,633815,610401,0.99,0.97,0.95,0.77,0.95,0.19,0.76,0.71,0.01,0.99,0.01,0.98,0.31,0.67,0.56,0.11,330254,466636,0.03,0.05,603141 +"167","INF0207",0,"PPD","2025-08-28","Male","HEU-lo",1232224,1105088,964965,866432,0.91,0.67,0.66,0.44,0.93,0.34,0.59,0.11,0.03,0.97,0.01,0.96,0.65,0.31,0.25,0.06,38724,345700,0.33,0.34,790680 +"168","INF0207",4,"PPD","2025-08-28","Male","HEU-lo",964456,862394,674289,650158,0.99,0.97,0.96,0.73,0.96,0.46,0.5,0.37,0.01,0.99,0.02,0.97,0.4,0.57,0.5,0.07,172564,465599,0.03,0.04,640947 +"169","INF0207",9,"PPD","2025-08-28","Male","HEU-lo",1131528,982637,762643,713953,0.98,0.96,0.94,0.92,0.94,0.3,0.64,0.57,0.01,0.99,0.02,0.98,0.68,0.3,0.26,0.04,365357,645599,0.04,0.06,702179 +"170","INF0166",0,"SEB","2025-08-28","Female","HU",1550664,1380306,1200328,1097863,0.92,0.88,0.87,0.62,0.79,0.09,0.7,0.53,0,1,0.01,0.99,0.82,0.17,0.14,0.03,328840,620906,0.12,0.13,1006028 +"171","INF0166",4,"SEB","2025-08-28","Female","HU",775352,679787,538754,516822,0.99,0.98,0.96,0.8,0.96,0.42,0.54,0.49,0.01,0.99,0,0.99,0.64,0.35,0.29,0.06,201010,406600,0.02,0.04,511111 +"172","INF0166",9,"SEB","2025-08-28","Female","HU",1043248,923970,742880,716921,0.98,0.98,0.97,0.81,0.95,0.3,0.64,0.61,0.01,0.99,0,0.99,0.68,0.31,0.26,0.05,351974,573086,0.02,0.03,703382 +"173","INF0199",0,"SEB","2025-08-28","Male","HEU-hi",1582712,1412403,1263938,1177939,0.87,0.87,0.84,0.71,0.28,0.04,0.24,0.19,0.01,0.99,0.01,0.98,0.53,0.44,0.38,0.07,136480,726424,0.13,0.16,1024741 +"174","INF0199",4,"SEB","2025-08-28","Male","HEU-hi",915104,813472,701070,665961,0.93,0.96,0.93,0.6,0.85,0.24,0.61,0.53,0.02,0.98,0,0.98,0.24,0.74,0.58,0.16,200002,374720,0.04,0.07,621032 +"175","INF0199",9,"SEB","2025-08-28","Male","HEU-hi",333800,301408,254051,245249,0.98,0.99,0.96,0.8,0.95,0.21,0.74,0.69,0,1,0.01,0.99,0.32,0.67,0.55,0.12,132098,191787,0.01,0.04,240956 +"176","INF0207",0,"SEB","2025-08-28","Male","HEU-lo",1196056,1073884,953274,871433,0.92,0.6,0.6,0.39,0.89,0.39,0.51,0.12,0.02,0.98,0.01,0.97,0.42,0.55,0.39,0.16,36036,312543,0.4,0.4,801074 +"177","INF0207",4,"SEB","2025-08-28","Male","HEU-lo",766016,680078,547528,530330,0.99,0.98,0.97,0.83,0.97,0.51,0.46,0.36,0.01,0.99,0.01,0.98,0.41,0.57,0.5,0.08,156863,435133,0.02,0.03,523880 +"178","INF0207",9,"SEB","2025-08-28","Male","HEU-lo",677136,599173,485830,453507,0.99,0.96,0.95,0.9,0.95,0.33,0.62,0.55,0.01,0.99,0.01,0.98,0.68,0.31,0.26,0.05,221304,402023,0.04,0.05,446958 +"179","INF0614",0,"Ctrl","2025-08-30","Female","HU",2502056,2240583,1939275,1791189,0.88,0.86,0.86,0.72,0.87,0.21,0.66,0.2,0,1,0.02,0.98,0.54,0.44,0.38,0.05,224396,1130412,0.14,0.14,1569007 +"180","INF0614",4,"Ctrl","2025-08-30","Female","HU",1391096,1344752,1105255,990319,0.67,0.91,0.9,0.64,0.81,0.3,0.51,0.38,0.01,0.99,0.02,0.97,0.34,0.63,0.53,0.11,163115,423783,0.09,0.1,666232 +"181","INF0614",9,"Ctrl","2025-08-30","Female","HU",985816,886942,751813,687188,0.94,0.97,0.93,0.51,0.82,0.31,0.52,0.38,0.02,0.98,0.02,0.96,0.27,0.69,0.58,0.11,126360,329490,0.03,0.07,648783 +"182","INF0622",0,"Ctrl","2025-08-30","Male","HEU-lo",1419968,1254039,1116059,1024019,0.92,0.79,0.77,0.35,0.91,0.1,0.82,0.49,0.01,0.99,0.02,0.97,0.67,0.3,0.2,0.1,161924,329095,0.21,0.23,939307 +"183","INF0622",9,"Ctrl","2025-08-30","Male","HEU-lo",918688,813691,633925,594892,0.96,1,0.98,0.76,0.93,0.25,0.68,0.67,0,1,0.02,0.98,0.72,0.26,0.2,0.06,291052,434924,0,0.02,570580 +"184","INF0627",9,"Ctrl","2025-08-30","Female","HEU-hi",1040808,940435,782722,722083,0.84,0.99,0.96,0.53,0.82,0.18,0.65,0.59,0,1,0.02,0.97,0.71,0.26,0.23,0.03,191328,322304,0.01,0.04,608173 +"185","INF0614",0,"PPD","2025-08-30","Female","HU",2167928,1927832,1630916,1508441,0.9,0.9,0.9,0.78,0.91,0.22,0.69,0.19,0.01,0.99,0.02,0.98,0.53,0.45,0.39,0.06,195461,1056211,0.1,0.1,1360009 +"186","INF0614",4,"PPD","2025-08-30","Female","HU",1324872,1244577,972809,876491,0.79,0.95,0.94,0.68,0.86,0.31,0.55,0.41,0.01,0.99,0.02,0.97,0.34,0.63,0.53,0.1,194236,468273,0.05,0.06,688585 +"187","INF0614",9,"PPD","2025-08-30","Female","HU",1181336,1066572,902472,813387,0.94,0.94,0.91,0.48,0.67,0.24,0.43,0.31,0.02,0.98,0.02,0.96,0.26,0.7,0.58,0.12,113124,362955,0.06,0.09,760542 +"188","INF0622",0,"PPD","2025-08-30","Male","HEU-lo",1269256,1125016,972593,879358,0.92,0.8,0.79,0.41,0.89,0.08,0.8,0.49,0.01,0.99,0.01,0.97,0.67,0.3,0.2,0.1,162742,334223,0.2,0.21,809182 +"189","INF0622",4,"PPD","2025-08-30","Male","HEU-lo",741976,658809,504597,468821,0.97,1,0.98,0.82,0.98,0.18,0.8,0.77,0,1,0.02,0.98,0.72,0.26,0.2,0.06,285674,372945,0,0.02,455133 +"190","INF0622",9,"PPD","2025-08-30","Male","HEU-lo",954616,852281,660431,621750,0.93,1,0.97,0.76,0.94,0.26,0.68,0.66,0,1,0.02,0.98,0.72,0.26,0.2,0.06,291251,438573,0,0.03,579322 +"191","INF0627",4,"PPD","2025-08-30","Female","HEU-hi",1274376,1221638,990572,930591,0.86,0.98,0.97,0.55,0.91,0.36,0.55,0.52,0,1,0.02,0.98,0.8,0.19,0.15,0.03,227988,437027,0.02,0.03,798574 +"192","INF0627",9,"PPD","2025-08-30","Female","HEU-hi",976928,872861,706543,648987,0.87,0.99,0.96,0.56,0.86,0.19,0.67,0.62,0,1,0.02,0.98,0.71,0.26,0.23,0.03,194169,315656,0.01,0.04,564577 +"193","INF0614",0,"SEB","2025-08-30","Female","HU",2404768,2139021,1869790,1725277,0.91,0.85,0.85,0.72,0.85,0.21,0.64,0.17,0.01,0.99,0.01,0.98,0.51,0.47,0.4,0.07,188308,1124974,0.15,0.15,1569343 +"194","INF0622",0,"SEB","2025-08-30","Male","HEU-lo",1313704,1154243,1022408,932997,0.91,0.8,0.78,0.37,0.88,0.1,0.79,0.51,0.01,0.99,0.01,0.98,0.66,0.32,0.2,0.12,160599,316077,0.2,0.22,852899 +"195","INF0622",9,"SEB","2025-08-30","Male","HEU-lo",611904,549416,424379,399846,0.94,1,0.98,0.78,0.95,0.29,0.66,0.65,0,1,0.01,0.98,0.72,0.27,0.21,0.06,189766,292228,0,0.02,373954 +"196","INF0627",9,"SEB","2025-08-30","Female","HEU-hi",688488,616891,512153,475077,0.87,0.99,0.96,0.56,0.83,0.2,0.64,0.59,0,1,0.01,0.99,0.69,0.3,0.26,0.04,134506,229306,0.01,0.04,411254 diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/data/tidy.csv b/course/04_IntroToTidyverse/homeworks/claude-chew/data/tidy.csv new file mode 100644 index 0000000..9742a99 --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/data/tidy.csv @@ -0,0 +1,37 @@ +"","bid","Condition","Date","infant_sex","phenotype","root","singletsFSC","singletsSSC","singletsSSCB","CD45","NotMonocytes","nonDebris","lymphocytes","live","Dump+","Dump-","Tcells","Vd2+","Vd2-","Va7.2+","Va7.2-","CD4+","CD4-","CD8+","CD8-","Tcells_count","lymphocytes_count","Monocytes","Debris","CD45_count" +"1","INF0159","SEB","2025-08-07","Male","HEU-hi",2086792,1847605,1507051,1327409,0.929341295712173,0.817877686411331,0.811086269957588,0.63500068092502,0.933116486052797,0.168540889286612,0.764575596766184,0.573310423094746,0.00499887553133928,0.995001124468661,0.0134001037628507,0.98160102070581,0.708139149100091,0.273461871605719,0.229282499927633,0.0441793716780858,449101,783347,0.182122313588669,0.188913730042412,1233616 +"2","INF0159","Ctrl","2025-08-07","Male","HEU-hi",2024024,1786795,1447822,1277260,0.931853342310884,0.818567843396887,0.811916966541452,0.651424653782203,0.946597483936038,0.162708392984737,0.783889090951301,0.583682213434657,0.00516847824886035,0.99483152175114,0.0213721768375277,0.973459344913612,0.724433268294623,0.249026076618989,0.217864947818036,0.0311611288009528,452551,775338,0.181432156603113,0.188083033458548,1190219 +"3","INF0159","PPD","2025-08-07","Male","HEU-hi",1898040,1677926,1357904,1200314,0.92715656069995,0.836210405623612,0.830270856040953,0.664310315856441,0.953162260904616,0.171448010745343,0.781714250159273,0.588793137264185,0.00438555180074111,0.995614448199259,0.021238568044972,0.974375880154287,0.719421171486792,0.254954708667495,0.223869899125417,0.0310848095420786,435293,739297,0.163789594376388,0.169729143959047,1112879 +"4","INF0199","Ctrl","2025-08-28","Male","HEU-hi",1729240,1545717,1379096,1282394,0.867265442601884,0.896476816618952,0.873258369178979,0.717055573937938,0.28363795498889,0.0213393990159149,0.262298555972975,0.21283724476233,0.00818329641325352,0.991816703586746,0.0199721921101004,0.971844511476646,0.552840882311354,0.419003629165292,0.373862940095207,0.0451406890700853,169736,797492,0.103523183381048,0.126741630821021,1112176 +"5","INF0052","SEB","2025-07-26","Male","HEU-hi",2523776,2282292,2041563,1889418,0.578359050247219,0.887807226093147,0.867014958426446,0.67185626879412,0.911565163264,0.233447156619843,0.678118006644156,0.274166109354803,0.00922563305131479,0.990774366948685,0.00842081207430187,0.982353554874383,0.608325425884434,0.37402812898995,0.281175634790126,0.0928524941998241,201287,734179,0.112192773906853,0.132985041573554,1092762 +"6","INF0180","SEB","2025-08-05","Male","HEU-hi",1661856,1483795,1251178,1155566,0.945002708629364,0.876733152444156,0.869922793959413,0.699612550400041,0.922558790344326,0.124676368415128,0.797882421929198,0.402479888374918,0.00404892532741009,0.99595107467259,0.0108816900767182,0.985069384595872,0.612174744462403,0.372894640133468,0.313003066776372,0.0598915733570957,307489,763986,0.123266847555844,0.130077206040587,1092013 +"7","INF0180","Ctrl","2025-08-05","Male","HEU-hi",1614504,1435508,1209469,1117422,0.939361315599657,0.867784231701032,0.861666077588712,0.699933216660966,0.927674650943114,0.107572676515665,0.820101974427449,0.387859435356761,0.0045269829237993,0.995473017076201,0.0201398100772745,0.975333206998926,0.66050084573867,0.314832361260256,0.295819032980299,0.019013328279957,284958,734694,0.132215768298968,0.138333922411288,1049663 +"8","INF0199","SEB","2025-08-28","Male","HEU-hi",1582712,1412403,1263938,1177939,0.869944029359755,0.866133979220115,0.843422874658084,0.708885464717426,0.282640716716408,0.0414248427915377,0.24121587392487,0.187879255090691,0.0113936107854631,0.988606389214537,0.0120896834701055,0.976516705744431,0.533514067995311,0.443002637749121,0.377667057444314,0.0653355803048066,136480,726424,0.133866020779885,0.156577125341916,1024741 +"9","INF0052","PPD","2025-07-26","Male","HEU-hi",2363512,2136616,1875394,1732620,0.587383846429107,0.86198368302262,0.84296849897761,0.640804431111718,0.900925393503078,0.207432282202851,0.693493111300228,0.28356755679248,0.00740820851132861,0.992591791488671,0.015070567241659,0.977521224247012,0.634034499540367,0.343486724706646,0.274411939652842,0.0690747850538041,184930,652155,0.13801631697738,0.15703150102239,1017713 +"10","INF0180","PPD","2025-08-05","Male","HEU-hi",1570368,1398767,1158451,1068711,0.942663638719916,0.896367507581134,0.890511050340717,0.70957332234834,0.929576735786159,0.10813752274956,0.821439213036599,0.407784021520629,0.00477523464515067,0.995224765354849,0.0192518799055931,0.975972885449256,0.659836571710851,0.316136313738405,0.296812393654976,0.0193239200834294,291504,714849,0.103632492418866,0.109488949659283,1007435 +"11","INF0159","Ctrl","2025-08-07","Male","HEU-hi",1487344,1333646,1131385,1067284,0.940156509420173,0.982565521310247,0.942089705744588,0.646537720223158,0.759423194013056,0.264593946774156,0.4948292472389,0.42502524104232,0.0127949864542873,0.987205013545713,0.0225689344402012,0.964636079105512,0.490235118756188,0.474400960349323,0.394639016729953,0.0797619436193709,275733,648745,0.0174344786897532,0.0579102942554121,1003414 +"12","INF0159","PPD","2025-08-07","Male","HEU-hi",1468272,1314327,1118313,1054808,0.946339997421332,0.981112134056363,0.940226826700274,0.633504874239511,0.820599997786103,0.307417030246581,0.513182967539522,0.438671092352724,0.0131866388850837,0.986813361114916,0.0228152644898018,0.963998096625114,0.479992934441713,0.484005162183402,0.403468612338772,0.0805365498446298,277402,632369,0.0188878659436369,0.0597731732997264,998207 +"13","INF0124","SEB","2025-07-31","Male","HEU-hi",1571248,1425147,1204162,1120656,0.879540197884096,0.899691780752428,0.891540913619476,0.636573186345826,0.779254310331088,0.235330211683555,0.543924098647533,0.407646235691996,0.00896878518703866,0.991031214812961,0.00402305141999249,0.987008163392969,0.48618713249093,0.500821030902039,0.445170774427624,0.0556502564744151,255776,627446,0.100308219247572,0.108459086380524,985662 +"14","INF0159","SEB","2025-08-07","Male","HEU-hi",1459280,1303303,1109557,1042434,0.940995784865037,0.978019748686445,0.936432513767603,0.633759325372148,0.809547172057246,0.292138446219946,0.5174087258373,0.446210294512692,0.0123001052646758,0.987699894735324,0.0150975500728201,0.972602344662504,0.473806399515494,0.49879594514701,0.416260508442804,0.0825354367042063,277396,621671,0.0219802513135547,0.0635674862323967,980926 +"15","INF0199","PPD","2025-08-28","Male","HEU-hi",1516328,1353418,1204623,1122951,0.855110329836297,0.90664797703091,0.883277948277891,0.726175661053875,0.292509192494565,0.020824370292611,0.271684822201954,0.22272797673338,0.00813212285107205,0.991867877148928,0.019490052153757,0.972377824995171,0.554053183954671,0.4183246410405,0.370826089755972,0.0474985512845277,155310,697308,0.0933520229690903,0.116722051722109,960247 +"16","INF0124","PPD","2025-07-31","Male","HEU-hi",1515456,1357582,1150459,1069355,0.887128222152606,0.906098634382362,0.896618897280887,0.637026105380776,0.772967212626465,0.207635714971257,0.565331497655208,0.425400203204273,0.00905176270144743,0.990948237298553,0.0075463771554826,0.98340186014307,0.516109959272903,0.467291900870167,0.416626147029878,0.0506657538402891,257077,604318,0.0939013656176376,0.103381102719113,948655 +"17","INF0124","PPD","2025-07-31","Male","HEU-hi",1583312,1418103,1190344,1093566,0.859891401159144,0.97322799644387,0.962200164194532,0.606947640660692,0.906363996341604,0.342808133972968,0.563555862368636,0.530500646526802,0.00374530598225108,0.996254694017749,0.00994454701283775,0.986310147004911,0.648634812850297,0.337675334154614,0.302699328553169,0.0349760056014453,302779,570742,0.0267720035561303,0.0377998358054678,940348 +"18","INF0052","Ctrl","2025-07-26","Male","HEU-hi",2098368,1894070,1666179,1537396,0.595294250798103,0.882034914658278,0.862764872929831,0.642013848293767,0.902058127245466,0.210909963527936,0.69114816371753,0.280426432119924,0.00812036098585309,0.991879639014147,0.0144807035218576,0.977398935492289,0.63411644039303,0.343282495099259,0.273482590989919,0.0697999041093396,164771,587573,0.117965085341722,0.137235127070169,915203 +"19","INF0199","Ctrl","2025-08-28","Male","HEU-hi",1090984,980857,815737,784725,0.987602026187518,0.97428760922637,0.950512002642594,0.742637381354226,0.926212033547567,0.20359800604996,0.722614027497607,0.674732121603848,0.00524803263153558,0.994751967368464,0.0140136376745911,0.980738329693873,0.336626014585308,0.644112315108566,0.534534526801533,0.109577788307033,388336,575541,0.0257123907736297,0.0494879973574057,774996 +"20","INF0124","PPD","2025-07-31","Male","HEU-hi",1246824,1108772,973652,900843,0.781135003546678,0.864643019554343,0.85943468622101,0.643083503865393,0.812693221368985,0.207716700734766,0.604976520634219,0.152471134191481,0.014218009478673,0.985781990521327,0.00927576561299767,0.976506224908329,0.66962331695581,0.30688290795252,0.266446367233358,0.0404365407191617,68997,452525,0.135356980445657,0.14056531377899,703680 +"21","INF0159","Ctrl","2025-08-07","Male","HEU-hi",1167840,1028158,742821,709883,0.982519654647315,0.986670470870599,0.965210172708947,0.813984463937007,0.923115267211876,0.0548056921123134,0.868309575099563,0.858577887845167,0.00239002303859118,0.997609976961409,0.0274596209197793,0.970150356041629,0.627872387130393,0.342277968911237,0.327390074326639,0.0148878945845976,487443,567733,0.0133295291294012,0.0347898272910532,697474 +"22","INF0124","Ctrl","2025-07-31","Male","HEU-hi",1105296,993220,820093,766344,0.899851763698809,0.947894129316295,0.938007181016131,0.699090481963352,0.91153726482607,0.258244311228194,0.653292953597876,0.479005994731274,0.00947930920995652,0.990520690790043,0.00774280715733315,0.98277788363271,0.509990299838908,0.472787583793802,0.423485648958099,0.0493019348357035,230924,482090,0.0521058706837046,0.0619928189838688,689596 +"23","INF0124","Ctrl","2025-07-31","Male","HEU-hi",1229248,1096279,962417,891568,0.771360120596522,0.857697900308265,0.851096376432269,0.620287326237422,0.848707405809876,0.216735742550119,0.631971663259757,0.164790521913621,0.0142253581233908,0.985774641876609,0.00988662389575658,0.975888017980853,0.672020143107103,0.30386787487375,0.264805041466919,0.039062833406831,70297,426584,0.142302099691735,0.148903623567731,687720 +"24","INF0124","SEB","2025-07-31","Male","HEU-hi",1109328,998592,812606,756059,0.904774627376964,0.966187324851658,0.954087562110507,0.656252421195124,0.903795347925456,0.368147412222277,0.53564793570318,0.510429521649834,0.00333419161127865,0.996665808388721,0.00606176982731157,0.99060403856141,0.663831440030374,0.326772598531035,0.289782273796483,0.0369903247345521,229141,448918,0.0338126751483416,0.0459124378894926,684063 +"25","INF0159","PPD","2025-08-07","Male","HEU-hi",1124616,979389,693430,664229,0.986489599219546,0.987891736804755,0.970960923609892,0.834537699063723,0.953283897336491,0.0770854096756791,0.876198487660812,0.865529821609809,0.00256495852542351,0.997435041474577,0.0272806791435489,0.970154362331028,0.626557673536135,0.343596688794892,0.328836556786153,0.0147601320087386,473302,546835,0.0121082631952446,0.0290390763901077,655255 +"26","INF0180","PPD","2025-08-05","Male","HEU-hi",1516936,1391367,1205249,1116976,0.580700032946097,0.859905832002319,0.852679810307295,0.619310298044488,0.699471249831965,0.106603900403782,0.592867349428183,0.434677945342567,0.018629983219843,0.981370016780157,0.0152624977807813,0.966107518999376,0.298383263368287,0.667724255631089,0.591028056651643,0.0766961989794457,174611,401702,0.140094167997681,0.147320189692705,648628 +"27","INF0199","Ctrl","2025-08-28","Male","HEU-hi",955672,847071,733820,687490,0.930010618336267,0.934141729475596,0.901921100828468,0.565672932701256,0.826955617735211,0.233648348245391,0.59330726948982,0.521875933155642,0.0159364238410596,0.98406357615894,0.0125139072847682,0.971549668874172,0.286638410596027,0.684911258278146,0.529997350993378,0.154913907284768,188750,361676,0.0658582705244044,0.0980788991715321,639373 +"28","INF0199","SEB","2025-08-28","Male","HEU-hi",915104,813472,701070,665961,0.932535088391062,0.95633880379755,0.926079493488258,0.603382756444112,0.84911133646456,0.242567783945346,0.606543552519214,0.533737190435525,0.017189828101719,0.982810171898281,0.0044249557504425,0.978385216147839,0.242657573424266,0.735727642723573,0.579969200307997,0.155758442415576,200002,374720,0.0436611962024501,0.0739205065117418,621032 +"29","INF0199","PPD","2025-08-28","Male","HEU-hi",858968,768197,633815,610401,0.98810617938044,0.973886703109223,0.953236473726707,0.773676470344414,0.952894761655766,0.188153078630881,0.764741683024885,0.707733651068499,0.00545943425363508,0.994540565746365,0.0140497919782955,0.980490773768069,0.311602584677248,0.668888189090821,0.558709357040339,0.110178832050482,330254,466636,0.0261132968907768,0.0467635262732926,603141 +"30","INF0124","SEB","2025-07-31","Male","HEU-hi",1004008,900404,794342,737214,0.815346697159848,0.858233028606603,0.850839731485564,0.645535989086402,0.90635582518517,0.244872713402848,0.661483111782322,0.178788831561097,0.0139389396603915,0.986061060339608,0.00593882434341396,0.980122235996195,0.65523106639375,0.324891169602445,0.256133421743016,0.0687577478594286,69374,388022,0.141766971393397,0.149160268514436,601085 +"31","INF0199","PPD","2025-08-28","Male","HEU-hi",897696,790855,670560,632602,0.937085244751044,0.939225913542802,0.909882220370377,0.599200070175202,0.859586100499146,0.233278060398584,0.626308040100561,0.548494258277568,0.0174050064415462,0.982594993558454,0.0131551257769634,0.96943986778149,0.267480713856767,0.701959153924724,0.548701681987794,0.153257471936929,194829,355207,0.0607740864571982,0.0901177796296234,592802 +"32","INF0124","Ctrl","2025-07-31","Male","HEU-hi",1017128,915840,757350,701114,0.745743202959861,0.954792091819658,0.946617678841582,0.744550550730514,0.902542840922811,0.341029415164569,0.561513425758241,0.534849430628659,0.00372698848763994,0.99627301151236,0.0102107957792816,0.986062215733079,0.662625893924913,0.323436321808166,0.290926031765853,0.0325102900423128,208211,389289,0.045207908180342,0.053382321158418,522851 +"33","INF0180","PPD","2025-08-05","Male","HEU-hi",638600,551845,454723,419608,0.989857200053383,0.93640815501069,0.908740056626668,0.631904986613764,0.981166869234902,0.198142214331163,0.783024654903739,0.594365682019942,0.0128398258963198,0.98716017410368,0.013935986769146,0.973224187334534,0.518778966531837,0.454445220802697,0.378848582362707,0.07559663843999,155999,262463,0.0635918449893103,0.0912599433733315,415352 +"34","INF0180","Ctrl","2025-08-05","Male","HEU-hi",528392,465660,387783,356166,0.986118832229915,0.924284355763591,0.897517809248851,0.643003570391376,0.977466048521721,0.210988456275987,0.766477592245735,0.5716158114038,0.012913271155455,0.987086728844545,0.0140674867536331,0.973019242090912,0.521325876119357,0.451693365971555,0.374554581228891,0.0771387847426641,129092,225837,0.0757156442364089,0.102482190751149,351222 +"35","INF0159","SEB","2025-08-07","Male","HEU-hi",527136,464846,340607,329303,0.989851291971224,0.990468184844199,0.978966808912723,0.810075438472701,0.908817547992259,0.101222103138385,0.807595444853874,0.791356280746668,0.00333078101071976,0.99666921898928,0.0168501148545176,0.979819104134763,0.607656967840735,0.372162136294028,0.351852029096478,0.0203101071975498,208960,264053,0.00953181515580082,0.0210331910872773,325961 +"36","INF0199","SEB","2025-08-28","Male","HEU-hi",333800,301408,254051,245249,0.982495341469282,0.988259267252112,0.96349125981507,0.795941997709125,0.948302022556273,0.205358027394975,0.742943995161299,0.688774525906344,0.00454208239337462,0.995457917606625,0.00611667095641115,0.989341246650214,0.31760511135672,0.671736135293494,0.553104513315872,0.118631621977623,132098,191787,0.0117407327478876,0.03650874018493,240956 diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/homeworks/README.md b/course/04_IntroToTidyverse/homeworks/claude-chew/homeworks/README.md new file mode 100644 index 0000000..2818b5e --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/homeworks/README.md @@ -0,0 +1,5 @@ +# Turning In Optional Take-Home Problems + +This folder is for the use of submitting your completed Take-Home Problems for evaluation by course instructors. Please see [Getting Help](/course/00_Homeworks/index.qmd) walkthrough for more detailed instructions. + +Within your branch, inside this "homeworks" folder, create a new folder (name it with your GitHub username). Then copy all files you will be submitting within your folder. Then commit the change to git, and push to GitHub. See [Getting Help](/course/00_Homeworks/index.qmd)for details on submitting the pull request to the UMGCCCFCSR/CytometryInR homework branch. \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/00_CheckNamesTRUE.png b/course/04_IntroToTidyverse/homeworks/claude-chew/images/00_CheckNamesTRUE.png new file mode 100644 index 0000000..cb71c41 Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/00_CheckNamesTRUE.png differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/01_DataView.png b/course/04_IntroToTidyverse/homeworks/claude-chew/images/01_DataView.png new file mode 100644 index 0000000..10c6e7f Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/01_DataView.png differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/02_Glimpse.png b/course/04_IntroToTidyverse/homeworks/claude-chew/images/02_Glimpse.png new file mode 100644 index 0000000..13644d3 Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/02_Glimpse.png differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/03_ColumnClass.png b/course/04_IntroToTidyverse/homeworks/claude-chew/images/03_ColumnClass.png new file mode 100644 index 0000000..f2fff2a Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/03_ColumnClass.png differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/TakeAway.jpg b/course/04_IntroToTidyverse/homeworks/claude-chew/images/TakeAway.jpg new file mode 100644 index 0000000..4d60a0e Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/TakeAway.jpg differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/images/WebsiteBanner.png b/course/04_IntroToTidyverse/homeworks/claude-chew/images/WebsiteBanner.png new file mode 100644 index 0000000..71d5502 Binary files /dev/null and b/course/04_IntroToTidyverse/homeworks/claude-chew/images/WebsiteBanner.png differ diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/index.qmd b/course/04_IntroToTidyverse/homeworks/claude-chew/index.qmd new file mode 100644 index 0000000..dc71ad5 --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/index.qmd @@ -0,0 +1,582 @@ +--- +title: "04 - Introduction to Tidyverse" +author: "David Rach" +date: 02-23-2026 +format: html +toc: true +toc-depth: 5 +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +For the YouTube livestream schedule, see [here](https://www.youtube.com/@cytometryinr) + +For screen-shot slides, click [here](/course/04_IntroToTidyverse/slides.qmd) + + +# Background + +Within our daily workflows as cytometrist, after acquiring data on our respective instruments, we begin analyzing the resulting datasets. After implementing various workflows, we then export data for downstream statistical analysis. + +When I first started my Ph.D program, a substantial amount of my day was spent renaming column names of the exported data so that they would fit nicely in a Microsoft Excel sheet column; setting up formulas to combine proportion of positive cells across positive quadrants, etc. Once this was done, additional hours would go by as I copied and pasted contents of those columns over to a GraphPad Prism worksheet for statistical analysis. + +This of course was in an ideal scenario. Often times, the data was less organized, and instead of time spent copying and pasting over columns, it would first be spent rearranging values from individual cells in the worksheet that were separated by spaces, all the while trying to remember what various color codes and bold font stood for. + +Today, we will explore what makes data ["tidy"](https://vita.had.co.nz/papers/tidy-data.pdf), and how to use the toolsets implemented in the various [tidyverse](https://cran.r-project.org/web/packages/tidyverse/vignettes/paper.html) R packages. At it's simplest, if we think of and organize all our data in terms of rows and columns, we need fewer tools (ie. functions) to reshape and extract useful information that we are interested in. Additionally, this approach aligns more closely with how computers work, allowing us to carry out tasks that would otherwise have taken hours in mere seconds. + +The dataset we will be using today is a manually-gated spectral flow cytometry dataset (similar to ones we would see exported by commercial software), and has been intentionally left slightly messy. You could however just as easily use a "matrix" or "data.frame" object exported from inside an [fcs file](/course/03_InsideFCSFile/), or swap in your own dataset. You would just need to make sure to switch out the input data by providing an alternate [file path](/course/02_FilePaths/), etc. + +--- + +# Walk Through + +:::{.callout-important title="Housekeeping"} +As we do [every week](/course/02_FilePaths/index.qmd), on GitHub, sync your forked version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. + +After creating a "Week04" project folder, copy over the contents of "course/04_IntroToTidyverse" to that folder. This will hopefully prevent any merge issues when you attempt to bring in new data to your local Cytometry in R folder next week. Please remember once you have set up your project folder to stage, commit and pus your changes to "Week04" to GitHub so that they are backed up remotely. + +If you are having issues syncing due to the Take-Home Problem merge conflict, see this [walkthrough](https://umgcccfcsr.github.io/CytometryInR/course/00_BonusContent/PullConflicts/) +::: + +--- + +## read.csv + +We will start by first loading in our copied over dataset (Dataset.csv) from it's location in the project folder. If you are following the organization scheme we have been using throughout the course, your file path will look something like this: + +```{r} +#| eval: FALSE +#| include: FALSE + +# For use only when building the website, otherwise keep eval to FALSE +thefilepath <- file.path(getwd(), "course", "04_IntroToTidyverse", "data", "Dataset.csv") + +thefilepath +``` +```{r} +#| eval: TRUE +thefilepath <- file.path("data", "Dataset.csv") + +thefilepath +``` + + +:::{.callout-tip title="Reminder"} +We encourage using the `file.path` function to build our file paths, as this keeps our code reproducible and replicable when a project folder is copied to other people's computers that differ on whether the operating system uses forward or backward slash separation between folders. +::: + +Above, we directly specified the name (Dataset) and filetype (.csv) of the file we wanted in the last argument of the file.path ("Dataset.csv"). This allows us to skip the `list.files()` step we used last week as we have provided the full file path. While this approach can be faster, if we accidentally mistype the file name, we could end up with an error at the next step due to no files being found with the mistyped name. + +Since our dataset is stored as a .csv file, we will be using the `read.csv()` function from the `utils` package (included in our base R software installation) to read it into R. We will also use the `colnames()` function from last week to get a read-out of the column names. + +```{r} +Data <- read.csv(file=thefilepath, check.names=FALSE) +colnames(Data) +``` + +As we look at the line of code, we now have enough context to decipher that the "file" argument is where we provide a file path to an individual file, but what does the "check.names" argument do? + +Let's see what happens to the column names when we set "check.names" argument to TRUE: + +```{r} +Data_Alternative <- read.csv(thefilepath, check.names=TRUE) +colnames(Data_Alternative) +``` + +As we can see, any column name that contained a special character or a space was automatically converted over to [R-approved syntax](https://ssojet.com/escaping/regex-escaping-in-r#understanding-the-need-for-escaping-special-characters). However, this resulted in the loss of both +" and "-", leaving us unable to determine whether we are looking at cells within or outside a particular gate. + +![](images/00_CheckNamesTRUE.png) + +Because of this, it is often better to rename columns individually after import, which we will learn how to do later today. + +Following up with what we practiced last week, lets use the `head()` function to visualize the first few rows of data. + +```{r} +head(Data, 3) +``` + +When working in Positron, we could have alternatively clicked on the little grid icon next to our created variable "Data" in the right secondary sidebar, which would have opened the data in our Editor window. From this same window, we can see it is stored as a "data.frame" object type. + +![](images/01_DataView.png) + +We could also achieve the same window to open using the `View()` function: + +```{r} +#| eval: FALSE +View(Data) +``` + +Wrapping up our brief recap of [last week](/course/03_InsideFCSFile/index.qmd) functions, we can check an objects type using both the `class()` and `str()` functions. + +```{r} +class(Data) +``` + +```{r} +str(Data) +``` + +## data.frame + +Or alternatively using the new-to-us `glimpse()` function + +```{r} +#| error: TRUE +glimpse(Data) +``` + +:::{.callout-tip title="Checkpoint 1"} +This however returns an error. Any idea why this might be occuring? +::: + +```{r} +#| code-fold: TRUE + +# We haven't attached/loaded the package in which the function glimpse is within +``` + +:::{.callout-tip title="Checkpoint 2"} +How would we locate a package a not-yet-loaded function is within? +::: + +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# We can use double ? to search all installed packages for a function, regardless +# if the package is attached to the environment or not + +??glimpse +``` + +![](images/02_Glimpse.png) + +From the list of search matches (in the right secondary sidebar), it looks likely that the `glimpse()` function in the `dplyr` package was the one we were looking for. This is one the main tidyverse packages we will be using throughout the course. Let's attach it to our environment via the `library()` call first and try running `glimpse()` again. + +```{r} +#| message: FALSE +#| warning: FALSE +library(dplyr) +glimpse(Data) +``` + +We notice that while similar to the `str()` output, `glimpse()` handles spacing a little differently, and includes the dimensions at the top. However, we can also retrieve the dimensions directly using the `dim()` function (which maintains the row followed by column position convention of base R (ex. [196,31])) + +```{r} +dim(Data) +``` + +## Column value type + +As we saw last week, functions often need values that match a certain type (the paintbrush needing paint analogy). As we inspect the columns of Data, we can notice some of the columns contain values within that are character (ie. "char") values. Others appear to contain numeric values (which are [subtyped](https://www.r-bloggers.com/2023/09/understanding-data-types-in-r/) as either double ("ie. dbl") or integer (ie. "int")). At first glance, we do not appear to have any logical (ie. TRUE or FALSE) columns in this dataset. + +![](images/03_ColumnClass.png) + +If we were trying to verify type of values contained within a data.frame column, we could employ several similarly-named functions (`is.character()`, `is.numeric()` or `is.logical()`) to check + +```{r} +# colnames(Data) # To recheck the column names + +is.character(Data$bid) +``` + +```{r} +is.numeric(Data$bid) +``` + +```{r} +# colnames(Data) # To recheck the column names + +is.character(Data$Tcells_count) +``` + +For numeric columns using the `is.numeric()` function, we can also be [subtype](https://www.r-bloggers.com/2023/09/understanding-data-types-in-r/) specific using either `is.integer()` or `is.double()`. + +```{r} +# colnames(Data) # To recheck the column names + +is.numeric(Data$Tcells_count) +is.integer(Data$Tcells_count) +is.double(Data$Tcells_count) +``` + +:::{.callout-tip title="Reminder"} +As we observed last week with keywords, column names that contain [special characters](https://ssojet.com/escaping/regex-escaping-in-r#understanding-the-need-for-escaping-special-characters) like $ or spaces will need to be surrounded with tick marks in order for the function to be able to run. +::: + +```{r} +#| error: TRUE + +# colnames(Data) # To recheck the column names +is.numeric(Data$CD8-) +``` + +```{r} +# colnames(Data) # To recheck the column names +is.numeric(Data$`CD8-`) +``` + +## select (Columns) + +Now that we have read in our data, and have a general picture of the structure and contents, lets start learning the main `dplyr` functions we will be using throughout the course. To do this, lets go ahead and attach `dplyr` to our local environment via the `library()` call. + +```{r} +library(dplyr) +``` + +We will start with the `select()` function. It is used to "select" a column from a data.frame type object. In the simplest usage, we provide the name of our data.frame variable/object as the first argument after the opening parenthesis. This is then followed by the name of the column we want to select as the second argument (let's place around the "" around the column name for now) + +```{r} +DateColumn <- select(Data, "Date") +DateColumn[1:10,] +``` + +This results in the column being selected, resulting in the new object containing only that subsetted out column from the original Data object. + +### Pipe Operators + +While the above line of code works to select a column, when you encounter `select()` out in the wild, it will more often be in a line of code that looks like this: + +```{r} +DateColumn <- Data |> select("Date") +DateColumn[1:10,] +``` + +... **"What in the world is that thing |> ?"** ... + +Glad you asked! An useful feature of the tidyverse packages is their use of [pipes](https://r4ds.had.co.nz/pipes.html) (either the original `magrittr` package's "%>%" or `base R version >4.1.0's` "|>""), usually appearing like this: + +```{r} +# magrittr %>% pipe + +DateColumn <- Data %>% select("Date") + +# base R |> pipe +DateColumn <- Data |> select("Date") +``` + +... **"How do we interpret/read that line of code?"** ... + +Let's break it down, starting off just to the right of the assignment arrow (<-) with our data.frame "Data". + +```{r} +#| eval: false + +Data +``` + +We then proceed to read to the right, adding in our pipe operator. The pipe essentially serves as an intermediate passing the contents of data onward to the subsequent function. + +```{r} +#| eval: FALSE +Data |> +``` + +In our case, this subsequent function is the `select()` function, which will select a particular column from the available data. When using the pipe, the first argument slot we saw for "select(Data, "Date")" is occupied by the contents Data that are being passed by the pipe. + +```{r} +#| eval: FALSE +Data |> select() +``` + +To complete the transfer, we provide the desired column name to `select()` to act on ("Date" in this case) + + +```{r} +#| eval: FALSE +Data |> select("Date") +``` + +In summary, contents of Data are passed to the pipe, and select runs on those contents to select the Date column + +```{r} +#| eval: FALSE +Data |> select("Date") +``` + +One of the main advantages for using pipes, is they can be linked together, passing resulting objects of one operation on to the next pipe and subsequent function. We can see this in operation in the example below where we hand off the isolated "Date" column to the `nrow()` function to determine number of rows. We will use pipes throughout the course, so you will gradually gain familiarity as you encounter them. + +```{r} +Data |> select("Date") |> nrow() +``` + +For those with prior R experience, you will be more familiar with the older magrittr %>% pipe. The base R |> pipe operator was introduced starting with R version 4.1.0. While mostly interchangeable, they have a [few nuances](https://tidyverse.org/blog/2023/04/base-vs-magrittr-pipe/) that come into play for more advance use cases. You are welcome to use whichever you prefer (my current preference is |> as it's one less key to press). + +### R Quirks + +:::{.callout-note title="Odd R Behavior # 1"} +While we used "" around the column name in our previous example, unlike what we encountered with `install.packages()` when we forget to include quotation marks, `select()` still retrieves the correct column despite Date not being an environment variable: +::: + +```{r} +Data |> select(Date) |> head(3) +``` + +:::{.callout-note title="."} +The reasons for this Odd R behaviour are nuanced and for [another day](https://adv-r.hadley.nz/evaluation.html). For now, think of it as `dplyr` R package is picking up the slack, and using context to infer it's a column name and not an environmental variable/object. +::: + +### Selecting multiple columns + +Since we are able to select one column, can we select multiple (similar to a [Data[,2:5]] approach in base R)? We can, and they can be positioned anywhere within the data.frame: + +```{r} +Subset <- Data |> select(bid, timepoint, Condition, Tcells, `CD8+`, `CD4+`) + +head(Subset, 3) +``` + +You will notice that the order in which we selected the columns will dictate their position in the subsetted data.frame object: + +```{r} +Subset <- Data |> select(bid, Tcells, `CD8+`, `CD4+`, timepoint, Condition, ) + +head(Subset, 3) +``` + +## relocate + +Alternatively, we occasionally want to move one column. While we could respecify the location using `select()`, specifying the names of all the other columns out in a line of code to just to rearrange one does not sound like a good use of time. For this reason, the second `dplyr` function we will be learning is the `relocate()` function. + +Looking at our Data object, let's say we wanted to move the Tcells column from its current location to the second column position (right after the bid column). The line of code to do so would look like: + +```{r} +Data |> relocate(Tcells, .after=bid) |> head(3) + +# |> head(3) is used only to make the website output visualization manageable :D +``` + +Similar to what we saw with `select()`, this approach can also be used for more than 1 column: + +```{r} +Data |> relocate(Tcells, Monocytes, .after=bid) |> head(3) + +# |> head(3) is used only to make the website output visualization manageable :D +``` + +We can also modify the argument so that columns are placed before a certain column + +```{r} +Data |> relocate(Tcells, .before=Date) |> head(3) + +# |> head(3) is used only to make the website output visualization manageable :D +``` + +And as we might suspect, we could specify a column index location rather than using a column name. + +```{r} +Data |> relocate(Date, .before=1) |> head(3) + +# |> head(3) is used only to make the website output visualization manageable :D +``` + +## rename + +At this point, we are able to both move and select particular columns, allowing us to rearrange and subset a larger data.frame object however we want it to appear. However, as we encountered, some of the names contain special characters and spaces, requiring use of tick marks (``) to avoid issues. How can we change a column name? + +In base R, we could change individual column names by assigning a new value with the assignment arrow to the corresponding column name index. For example, looking at our Subset object, wen could rename CD8+ as follows: + +```{r} +colnames(Subset) +colnames(Subset)[3] +``` + +```{r} +colnames(Subset)[3] <- "CD8Positive" +colnames(Subset) +``` + +With the tidyverse, we can use the `rename()` function which removes the need to look up the column index number. The way we write the argument is placing within the parenthesis the old name to the right of the equals sign, with the new name to the left + +```{r} +Renamed <- Subset |> rename(CD4_Positive = `CD4+`) +colnames(Renamed) +``` + +If we wanted to rename multiple column names at once, we would just need to include a comma between the individual rename arguments within the parenthesis. + +```{r} +Renamed_Multiple <- Subset |> rename(specimen = bid, timepoint_months = timepoint, stimulation = Condition, CD4Positive=`CD4+`) +colnames(Renamed_Multiple) +``` + +## pull + +Sometimes, we may want to retrieve individual values present in a column, to use within either a vector or a list. We can do this using the `pull()` function, which will retrieve the column contents and strip the column formatting + +```{r} +Data |> pull(Date) |> head(5) +``` + +This can be useful when we are doing data exploration, and trying to determine how many unique variants might be present. For example, if we wanted to see what days individual samples were acquired, we could `pull()` the data and pass it to the `unique()` function: + +```{r} +Data |> pull(Date) |> unique() +``` + + +## filter (Rows) + +So far, we have been working with `dplyr` functions primarily used when working with and subsetting columns (including `select()`, `pull()`, `rename()` and `relocate()`). What if we wanted to work with rows of a data.frame? This is where the `filter()` function is used. + +The Condition column in this Dataset appears to be indicating whether the samples were stimulated. Let's see how many unique values are contained within that column + +```{r} +Data |> pull(Condition) |> unique() +``` + +In the case of this dataset, looks like the .fcs files where treated with either left alone, treated with [PPD (Purified Protein Derrivative)](https://en.wikipedia.org/wiki/Tuberculin) or [SEB](https://en.wikipedia.org/wiki/Enterotoxin_type_B). What if we wanted to subset only those treated with PPD? + +Within `filter()`, we would specify the column name as the first argument, and ask that only values equal to (==) "PPD" be returned. Notice in this case, "" are needed, as we are asking for a matching character value. + +```{r} +PPDOnly <- Data |> filter(Condition == "PPD") +head(PPDOnly, 5) +``` + +While this works, using "==" to match can glitch, especially with character values. Using the %in% operator is a better way of identifying and extracting only the rows whose Condition column contains "PPD" + +```{r} +Data |> filter(Condition %in% "PPD") |> head(5) +``` + +Similar to what we saw for `select()`, we can grab rows that contain various values at once. We would just need to modify the second part of the argument. If we wanted to grab rows whose Condition column contained either PPD or SEB, we would need to provide that argument as a vector, placing both within `c()`/ + +```{r} +Data |> filter(Condition %in% c("PPD", "SEB")) |> head(5) +``` + +Alternatively, we could have set up the vector externally, and then provided it to `filter()` + +```{r} +TheseConditions <- c("PPD", "SEB") +Data |> filter(Condition %in% TheseConditions) |> head(5) +``` + +While this works when we have a limited number of variant condition values, what if had many more but only wanted to exclude one value? +As we saw when learning about [Conditionals](/course/02_FilePaths/index.qmd), when we add a ! in front of a logical value, we get the opposite logical value returned + +```{r} +IsThisASpectralInstrument <- TRUE + +!IsThisASpectralInstrument +``` + +In the context of the `dplyr` package, we can use ! within the `filter()` to remove rows that contain a certain value + +```{r} +Subset <- Data |> filter(!Condition %in% "SEB") +Subset |> pull(Condition) |> unique() +``` + +Likewise, we can also use it with the `select()` to exclude columns we don't want to include +```{r} +Subset <- Data |> select(!timepoint) +Subset[1:3,] +``` + + +## mutate + +As we can see, with just these handful of functions, we have the building blocks to rearrange and subset a larger data.frame into a format that we prefer. But what if we wanted to alter the content of a column, or add new columns to an existing data.frame? This is where the `mutate()` function can be used. + +Let's start by slimming down our current Data to a smaller workable example, highlighting the functions and pipes we learned about today + +```{r} +TidyData <- Data |> filter(Condition %in% "Ctrl") |> filter(timepoint %in% "0") |> + select(bid, timepoint, Condition, Date, Tcells_count, CD45_count) |> + rename(specimen=bid, condition=Condition) |> relocate(Date, .after=specimen) +``` + +```{r} +TidyData +``` + +The `mutate()` function can be used to modify existing columns, as well as to create new ones. For example, let's derrive the proportion of T cells from the overall CD45 gate. To do so, within the parenthesis, we would specify a new column name, and then divide the original columns: + +```{r} +TidyData <- TidyData |> mutate(Tcells_ProportionCD45 = Tcells_count / CD45_count) +TidyData +``` + +We can see that we have many significant digits being returned. Let's round this new column to 2 significant digits by applying the `round()` function + +```{r} +TidyData <- TidyData |> mutate(TcellsRounded = round(Tcells_ProportionCD45, 2)) +TidyData +``` + + +## arrange + +And while we are here, let's rearrange the rows so that they are descending based on the Tcell proportion. We can use this by using the `desc()` and `arrange()` functions from `dplyr`: + +```{r} +TidyData <- TidyData |> arrange(desc(TcellsRounded)) +``` + +And let's go ahead and `filter()` and identify the specimens that had more than 30% T cells as part of the overall CD45 gate (context, these samples were Cord Blood): + +```{r} +TidyData |> filter(TcellsRounded > 0.3) +``` + +Which is we had wanted to just retrieve the specimen IDs, we could add `pull()` after a new pipe argument. + +```{r} +TidyData |> filter(TcellsRounded > 0.3) |> pull(specimen) +``` + +And finally, since I may want to send the data to a supervisor, let's go ahead and export this "tidyed" version of our data.frame out to it's own .fcs file. Working within our project folder, this would look like this: + +```{r} +NewName <- paste0("MyNewDataset", ".csv") +StorageLocation <- file.path("data", NewName) +StorageLocation +``` +```{r} +#| eval: FALSE +write.csv(TidyData, StorageLocation, row.names=FALSE) +``` + +# Take Away + +In this session, we explored the main functions within the `dplyr` package used in context of "tidying" data, including selecting columns, filtering for rows, as well as additional functions used to create or modify existing values. We will continue to build on these throughout the course, introducing a few additional tidyverse functions we don't have time to cover today as appropiate. As we saw, knowing how to use these functions can allow us to extensively and quickly modify our existing exported data files. + +On important goal as we move through the course (in terms of both reproducibility and replicability) is to attempt to only modify files within R, not go back to the original csv or excel file and hand-modify individual values. This approach is not reproducible or replicable. Once set up, an R script can quickly re-carry out these same cleanup steps, and leave a documented process of how the data has changed (even more so if you are maintaining version control). If you do want to save the changes you have made, it is best to save it out as a new .csv file with which you work later. + +Next week, we will be using these skills when setting up metadata for our .fcs files. We will additionally take a look at the main format source of controversy within Bioconductor Flow Cytometry packages, ie. whether to use a flowframe or a cytoframe. Exciting stuff, but important information to know as the functions needed to import them are slightly different. We will also look at how to import existing manually gated .wsp from FlowJo/Diva/Floreada in via the `CytoML` package. + +![](images/TakeAway.jpg) + +# Additional Resources + +[Data Organization in Spreadsheets for Ecologists](https://datacarpentry.github.io/spreadsheet-ecology-lesson/) This Carpentry self-study course was one of my "Aha" moments early on when learning R, and reinforced the need to try to keep my own Excel/CSV files in a tidy manner. It is worth the time going through in its entirety (even for non-Ecologist). + +[Data Analysis and Visualization in R for Ecologists](https://datacarpentry.github.io/R-ecology-lesson/) Continuation of the above, and a good way to continue building on the tidyverse functions we learned today. + +[Simplistics: Introduction to Tidyverse in R](https://youtu.be/Bg4qxVNaDck?si=QPQq8TzOZ1w6XSy4) The YouTube channel is mainly focused on statistics for Psych classes, but at the end of the day, we are all working with similar objects with rows and columns, just the values contained within differ. + +[Riffomonas Project Playlist: Data Manipulation with R's Tidyverse](https://youtube.com/playlist?list=PLmNrK_nkqBpKf7j_ewpUm-w33R6PJYtD9&si=BVmDZPIXjRuHjERP) Riffomonas has a playlist that delves into both the tidyverse functions we used today, as well as other ones we will encounter later on in the course. + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Taking a dataset (either todays or one of your own), work through the column-operating functions (`select()`, `rename()`, and `relocate()`). Once this is done, `filter()` by conditions from two separate columns, arrange in an order that makes sense, and export this "tidy" data as a .csv file. +::: + +:::{.callout-tip title="Problem 2"} +We used the `mutate()` function to create new columns, but it can also be used to modify existing ones. Various numeric columns are showing way to many significant digits. As was shown, use `round()` to round all these proportion columns, but use mutate to overwrite the existing column. Export this as it's own .csv file. +::: + +:::{.callout-tip title="Problem 3"} +We can also use `mutate()` to combine columns. For our dataset, "bid", "timepoint", "Condition" are separate columns that originally were all part of the filename for the individual .fcs file. Try to figure out a way to combine them back together using `paste0()`, and save the new column as "filename". Once this is done, `pull()` the contents of this column, and using try to determine whether there were any duplicates (think innovative ways of using !, `length()` and `unique()`) +::: + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: \ No newline at end of file diff --git a/course/04_IntroToTidyverse/homeworks/claude-chew/slides.qmd b/course/04_IntroToTidyverse/homeworks/claude-chew/slides.qmd new file mode 100644 index 0000000..97a8b8f --- /dev/null +++ b/course/04_IntroToTidyverse/homeworks/claude-chew/slides.qmd @@ -0,0 +1,1199 @@ +--- +title: "04 - Introduction to Tidyverse" +author: "David Rach" +date: 02-24-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + + +---- + +# Background + +::: {.fragment} +::: {.callout-tip title="."} +Within our daily workflows as cytometrist, after acquiring data on our respective instruments, we begin analyzing the resulting datasets. After implementing various workflows, we then export data for downstream statistical analysis. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +When I first started my Ph.D program, a substantial amount of my day was spent renaming column names of the exported data so that they would fit nicely in a Microsoft Excel sheet column; setting up formulas to combine proportion of positive cells across positive quadrants, etc. Once this was done, additional hours would go by as I copied and pasted contents of those columns over to a GraphPad Prism worksheet for statistical analysis. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This of course was in an ideal scenario. Often times, the data was less organized, and instead of time spent copying and pasting over columns, it would first be spent rearranging values from individual cells in the worksheet that were separated by spaces, all the while trying to remember what various color codes and bold font stood for. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +Today, we will explore what makes data ["tidy"](https://vita.had.co.nz/papers/tidy-data.pdf), and how to use the toolsets implemented in the various [tidyverse](https://cran.r-project.org/web/packages/tidyverse/vignettes/paper.html) R packages. At it's simplest, if we think of and organize all our data in terms of rows and columns, we need fewer tools (ie. functions) to reshape and extract useful information that we are interested in. Additionally, this approach aligns more closely with how computers work, allowing us to carry out tasks that would otherwise have taken hours in mere seconds. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The dataset we will be using today is a manually-gated spectral flow cytometry dataset (similar to ones we would see exported by commercial software), and has been intentionally left slightly messy. You could however just as easily use a "matrix" or "data.frame" object exported from inside an [fcs file](/course/03_InsideFCSFile/), or swap in your own dataset. You would just need to make sure to switch out the input data by providing an alternate [file path](/course/02_FilePaths/), etc. +::: +::: + +--- + +# Walk Through + +:::{.callout-important title="Housekeeping"} +As we do [every week](/course/02_FilePaths/index.qmd), on GitHub, sync your forked version of the CytometryInR course to bring in the most recent updates. Then within Positron, pull in those changes to your local computer. + +After creating a "Week04" project folder, copy over the contents of "course/04_IntroToTidyverse" to that folder. This will hopefully prevent any merge issues when you attempt to bring in new data to your local Cytometry in R folder next week. Please remember once you have set up your project folder to stage, commit and pus your changes to "Week04" to GitHub so that they are backed up remotely. + +If you are having issues syncing due to the Take-Home Problem merge conflict, see this [walkthrough](https://umgcccfcsr.github.io/CytometryInR/course/00_BonusContent/PullConflicts/) +::: + +--- + +## read.csv + +::: {.fragment} +::: {.callout-tip title="."} +We will start by first loading in our copied over dataset (Dataset.csv) from it's location in the project folder. If you are following the organization scheme we have been using throughout the course, your file path will look something like this: +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +#| include: FALSE + +# For use only when building the website, otherwise keep eval to FALSE +thefilepath <- file.path(getwd(), "course", "04_IntroToTidyverse", "data", "Dataset.csv") + +thefilepath +``` + +::: + +::: {.fragment} +```{r} +#| eval: TRUE +thefilepath <- file.path("data", "Dataset.csv") + +thefilepath +``` + +::: + +--- + +::: {.fragment} +:::{.callout-tip title="Reminder"} +We encourage using the `file.path` function to build our file paths, as this keeps our code reproducible and replicable when a project folder is copied to other people's computers that differ on whether the operating system uses forward or backward slash separation between folders. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Above, we directly specified the name (Dataset) and filetype (.csv) of the file we wanted in the last argument of the file.path ("Dataset.csv"). This allows us to skip the `list.files()` step we used last week as we have provided the full file path. While this approach can be faster, if we accidentally mistype the file name, we could end up with an error at the next step due to no files being found with the mistyped name. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Since our dataset is stored as a .csv file, we will be using the `read.csv()` function from the `utils` package (included in our base R software installation) to read it into R. We will also use the `colnames()` function from last week to get a read-out of the column names. +::: +::: + +::: {.fragment} +```{r} +Data <- read.csv(file=thefilepath, check.names=FALSE) +colnames(Data) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we look at the line of code, we now have enough context to decipher that the "file" argument is where we provide a file path to an individual file, but what does the "check.names" argument do? + +Let's see what happens to the column names when we set "check.names" argument to TRUE: +::: +::: + + +::: {.fragment} +```{r} +Data_Alternative <- read.csv(thefilepath, check.names=TRUE) +colnames(Data_Alternative) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we can see, any column name that contained a special character or a space was automatically converted over to [R-approved syntax](https://ssojet.com/escaping/regex-escaping-in-r#understanding-the-need-for-escaping-special-characters). However, this resulted in the loss of both +" and "-", leaving us unable to determine whether we are looking at cells within or outside a particular gate. +::: +::: + +::: {.fragment} +![](images/00_CheckNamesTRUE.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Because of this, it is often better to rename columns individually after import, which we will learn how to do later today. + +Following up with what we practiced last week, lets use the `head()` function to visualize the first few rows of data. +::: +::: + +::: {.fragment} +```{r} +head(Data, 3) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +When working in Positron, we could have alternatively clicked on the little grid icon next to our created variable "Data" in the right secondary sidebar, which would have opened the data in our Editor window. From this same window, we can see it is stored as a "data.frame" object type. +::: +::: + +--- + +![](images/01_DataView.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We could also achieve the same window to open using the `View()` function: +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +View(Data) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Wrapping up our brief recap of [last week](/course/03_InsideFCSFile/index.qmd) functions, we can check an objects type using both the `class()` and `str()` functions. +::: +::: + +::: {.fragment} +```{r} +class(Data) +``` + +::: + +::: {.fragment} +```{r} +str(Data) +``` + +::: + +--- + +## data.frame + +::: {.fragment} +::: {.callout-tip title="."} +Or alternatively using the new-to-us `glimpse()` function +::: +::: + +::: {.fragment} +```{r} +#| error: TRUE +glimpse(Data) +``` + +::: + +--- + +:::{.callout-tip title="Checkpoint 1"} +This however returns an error. Any idea why this might be occuring? +::: + +::: {.fragment} +```{r} +#| code-fold: TRUE + +# We haven't attached/loaded the package in which the function glimpse is within +``` + +::: + +--- + +:::{.callout-tip title="Checkpoint 2"} +How would we locate a package a not-yet-loaded function is within? +::: + +::: {.fragment} +```{r} +#| code-fold: TRUE +#| eval: FALSE + +# We can use double ? to search all installed packages for a function, regardless +# if the package is attached to the environment or not + +??glimpse +``` + +::: + +--- + +![](images/02_Glimpse.png) + +::: {.fragment} +::: {.callout-tip title="."} +From the list of search matches (in the right secondary sidebar), it looks likely that the `glimpse()` function in the `dplyr` package was the one we were looking for. This is one the main tidyverse packages we will be using throughout the course. Let's attach it to our environment via the `library()` call first and try running `glimpse()` again. +::: +::: + +::: {.fragment} +```{r} +#| message: FALSE +#| warning: FALSE +library(dplyr) +glimpse(Data) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We notice that while similar to the `str()` output, `glimpse()` handles spacing a little differently, and includes the dimensions at the top. However, we can also retrieve the dimensions directly using the `dim()` function (which maintains the row followed by column position convention of base R (ex. [196,31])) +::: +::: + +::: {.fragment} +```{r} +dim(Data) +``` + +::: + +--- + +## Column value type + +::: {.fragment} +::: {.callout-tip title="."} +As we saw last week, functions often need values that match a certain type (the paintbrush needing paint analogy). As we inspect the columns of Data, we can notice some of the columns contain values within that are character (ie. "char") values. Others appear to contain numeric values (which are [subtyped](https://www.r-bloggers.com/2023/09/understanding-data-types-in-r/) as either double ("ie. dbl") or integer (ie. "int")). At first glance, we do not appear to have any logical (ie. TRUE or FALSE) columns in this dataset. +::: +::: + +--- + +![](images/03_ColumnClass.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were trying to verify type of values contained within a data.frame column, we could employ several similarly-named functions (`is.character()`, `is.numeric()` or `is.logical()`) to check +::: +::: + +::: {.fragment} +```{r} +# colnames(Data) # To recheck the column names + +is.character(Data$bid) +``` + +::: + +::: {.fragment} +```{r} +is.numeric(Data$bid) +``` + +::: + +::: {.fragment} +```{r} +# colnames(Data) # To recheck the column names + +is.character(Data$Tcells_count) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For numeric columns using the `is.numeric()` function, we can also be [subtype](https://www.r-bloggers.com/2023/09/understanding-data-types-in-r/) specific using either `is.integer()` or `is.double()`. +::: +::: + +::: {.fragment} +```{r} +# colnames(Data) # To recheck the column names + +is.numeric(Data$Tcells_count) +is.integer(Data$Tcells_count) +is.double(Data$Tcells_count) +``` + +::: + +--- + +:::{.callout-tip title="Reminder"} +As we observed last week with keywords, column names that contain [special characters](https://ssojet.com/escaping/regex-escaping-in-r#understanding-the-need-for-escaping-special-characters) like $ or spaces will need to be surrounded with tick marks in order for the function to be able to run. +::: + +::: {.fragment} +```{r} +#| error: TRUE + +# colnames(Data) # To recheck the column names +is.numeric(Data$CD8-) +``` + +::: + +::: {.fragment} +```{r} +# colnames(Data) # To recheck the column names +is.numeric(Data$`CD8-`) +``` + +::: + +--- + +## select (Columns) + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have read in our data, and have a general picture of the structure and contents, lets start learning the main `dplyr` functions we will be using throughout the course. To do this, lets go ahead and attach `dplyr` to our local environment via the `library()` call. +::: +::: + +::: {.fragment} +```{r} +library(dplyr) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We will start with the `select()` function. It is used to "select" a column from a data.frame type object. In the simplest usage, we provide the name of our data.frame variable/object as the first argument after the opening parenthesis. This is then followed by the name of the column we want to select as the second argument (let's place around the "" around the column name for now) +::: +::: + +::: {.fragment} +```{r} +DateColumn <- select(Data, "Date") +DateColumn +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This results in the column being selected, resulting in the new object containing only that subsetted out column from the original Data object. +::: +::: + +--- + +### Pipe Operators + +::: {.fragment} +::: {.callout-tip title="."} +While the above line of code works to select a column, when you encounter `select()` out in the wild, it will more often be in a line of code that looks like this: +::: +::: + +::: {.fragment} +```{r} +DateColumn <- Data |> select("Date") +DateColumn +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +... **"What in the world is that thing |> ?"** ... +::: +::: + + +::: {.fragment} +::: {.callout-tip title="."} +Glad you asked! An useful feature of the tidyverse packages is their use of [pipes](https://r4ds.had.co.nz/pipes.html) (either the original `magrittr` package's "%>%" or `base R version >4.1.0's` "|>""), usually appearing like this: +::: +::: + +::: {.fragment} +```{r} +# magrittr %>% pipe + +DateColumn <- Data %>% select("Date") + +# base R |> pipe +DateColumn <- Data |> select("Date") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +... **"How do we interpret/read that line of code?"** ... +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +Let's break it down, starting off just to the right of the assignment arrow (<-) with our data.frame "Data". +::: +::: + +::: {.fragment} +```{r} +#| eval: false + +Data +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We then proceed to read to the right, adding in our pipe operator. The pipe essentially serves as an intermediate passing the contents of data onward to the subsequent function. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +Data |> +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In our case, this subsequent function is the `select()` function, which will select a particular column from the available data. When using the pipe, the first argument slot we saw for "select(Data, "Date")" is occupied by the contents Data that are being passed by the pipe. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +Data |> select() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To complete the transfer, we provide the desired column name to `select()` to act on ("Date" in this case) +::: +::: + + +::: {.fragment} +```{r} +#| eval: FALSE +Data |> select("Date") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In summary, contents of Data are passed to the pipe, and select runs on those contents to select the Date column +::: +::: + +::: {.fragment} +```{r} +Data |> select("Date") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +One of the main advantages for using pipes, is they can be linked together, passing resulting objects of one operation on to the next pipe and subsequent function. We can see this in operation in the example below where we hand off the isolated "Date" column to the `nrow()` function to determine number of rows. We will use pipes throughout the course, so you will gradually gain familiarity as you encounter them. +::: +::: + +::: {.fragment} +```{r} +Data |> select("Date") |> nrow() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +For those with prior R experience, you will be more familiar with the older magrittr %>% pipe. The base R |> pipe operator was introduced starting with R version 4.1.0. While mostly interchangeable, they have a [few nuances](https://tidyverse.org/blog/2023/04/base-vs-magrittr-pipe/) that come into play for more advance use cases. You are welcome to use whichever you prefer (my current preference is |> as it's one less key to press). +::: +::: + +--- + +### R Quirks + +:::{.callout-note title="Odd R Behavior # 1"} +While we used "" around the column name in our previous example, unlike what we encountered with `install.packages()` when we forget to include quotation marks, `select()` still retrieves the correct column despite Date not being an environment variable: +::: + +::: {.fragment} +```{r} +Data |> select(Date) |> head(5) +``` + +::: + +--- + +:::{.callout-note title="."} +The reasons for this Odd R behaviour are nuanced and for [another day](https://adv-r.hadley.nz/evaluation.html). For now, think of it as `dplyr` R package is picking up the slack, and using context to infer it's a column name and not an environmental variable/object. +::: + +--- + +### Selecting multiple columns + +::: {.fragment} +::: {.callout-tip title="."} +Since we are able to select one column, can we select multiple (similar to a [Data[,2:5]] approach in base R)? We can, and they can be positioned anywhere within the data.frame: +::: +::: + +::: {.fragment} +```{r} +Subset <- Data |> select(bid, timepoint, Condition, Tcells, `CD8+`, `CD4+`) + +head(Subset, 5) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +You will notice that the order in which we selected the columns will dictate their position in the subsetted data.frame object: +::: +::: + +::: {.fragment} +```{r} +Subset <- Data |> select(bid, Tcells, `CD8+`, `CD4+`, timepoint, Condition, ) + +head(Subset, 5) +``` + +::: + +--- + +## relocate + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we occasionally want to move one column. While we could respecify the location using `select()`, specifying the names of all the other columns out in a line of code to just to rearrange one does not sound like a good use of time. For this reason, the second `dplyr` function we will be learning is the `relocate()` function. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Looking at our Data object, let's say we wanted to move the Tcells column from its current location to the second column position (right after the bid column). The line of code to do so would look like: +::: +::: + +::: {.fragment} +```{r} +Data |> relocate(Tcells, .after=bid) |> head(5) + +# |> head(5) is used only to make the website output visualization manageable :D +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to what we saw with `select()`, this approach can also be used for more than 1 column: +::: +::: + +::: {.fragment} +```{r} +Data |> relocate(Tcells, Monocytes, .after=bid) |> head(5) + +# |> head(5) is used only to make the website output visualization manageable :D +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also modify the argument so that columns are placed before a certain column +::: +::: + +::: {.fragment} +```{r} +Data |> relocate(Tcells, .before=Date) |> head(5) + +# |> head(5) is used only to make the website output visualization manageable :D +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And as we might suspect, we could specify a column index location rather than using a column name. +::: +::: + +::: {.fragment} +```{r} +Data |> relocate(Date, .before=1) |> head(5) + +# |> head(5) is used only to make the website output visualization manageable :D +``` + +::: + +--- + +## rename + +::: {.fragment} +::: {.callout-tip title="."} +At this point, we are able to both move and select particular columns, allowing us to rearrange and subset a larger data.frame object however we want it to appear. However, as we encountered, some of the names contain special characters and spaces, requiring use of tick marks (``) to avoid issues. How can we change a column name? +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In base R, we could change individual column names by assigning a new value with the assignment arrow to the corresponding column name index. For example, looking at our Subset object, wen could rename CD8+ as follows: +::: +::: + + +::: {.fragment} +```{r} +colnames(Subset) +colnames(Subset)[3] +``` + +::: + + +::: {.fragment} +```{r} +colnames(Subset)[3] <- "CD8Positive" +colnames(Subset) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With the tidyverse, we can use the `rename()` function which removes the need to look up the column index number. The way we write the argument is placing within the parenthesis the old name to the right of the equals sign, with the new name to the left +::: +::: + +::: {.fragment} +```{r} +Renamed <- Subset |> rename(CD4_Positive = `CD4+`) +colnames(Renamed) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we wanted to rename multiple column names at once, we would just need to include a comma between the individual rename arguments within the parenthesis. +::: +::: + +::: {.fragment} +```{r} +Renamed_Multiple <- Subset |> rename(specimen = bid, timepoint_months = timepoint, stimulation = Condition, CD4Positive=`CD4+`) +colnames(Renamed_Multiple) +``` + +::: + +--- + +## pull + +::: {.fragment} +::: {.callout-tip title="."} +Sometimes, we may want to retrieve individual values present in a column, to use within either a vector or a list. We can do this using the `pull()` function, which will retrieve the column contents and strip the column formatting +::: +::: + +::: {.fragment} +```{r} +Data |> pull(Date) |> head(10) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This can be useful when we are doing data exploration, and trying to determine how many unique variants might be present. For example, if we wanted to see what days individual samples were acquired, we could `pull()` the data and pass it to the `unique()` function: +::: +::: + +::: {.fragment} +```{r} +Data |> pull(Date) |> unique() +``` + +::: + +--- + + +## filter (Rows) + +::: {.fragment} +::: {.callout-tip title="."} +So far, we have been working with `dplyr` functions primarily used when working with and subsetting columns (including `select()`, `pull()`, `rename()` and `relocate()`). What if we wanted to work with rows of a data.frame? This is where the `filter()` function is used. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The Condition column in this Dataset appears to be indicating whether the samples were stimulated. Let's see how many unique values are contained within that column +::: +::: + +::: {.fragment} +```{r} +Data |> pull(Condition) |> unique() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the case of this dataset, looks like the .fcs files where treated with either left alone, treated with [PPD (Purified Protein Derrivative)](https://en.wikipedia.org/wiki/Tuberculin) or [SEB](https://en.wikipedia.org/wiki/Enterotoxin_type_B). What if we wanted to subset only those treated with PPD? +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Within `filter()`, we would specify the column name as the first argument, and ask that only values equal to (==) "PPD" be returned. Notice in this case, "" are needed, as we are asking for a matching character value. +::: +::: + +::: {.fragment} +```{r} +PPDOnly <- Data |> filter(Condition == "PPD") +head(PPDOnly, 5) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +While this works, using "==" to match can glitch, especially with character values. Using the %in% operator is a better way of identifying and extracting only the rows whose Condition column contains "PPD" +::: +::: + +::: {.fragment} +```{r} +Data |> filter(Condition %in% "PPD") |> head(10) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to what we saw for `select()`, we can grab rows that contain various values at once. We would just need to modify the second part of the argument. If we wanted to grab rows whose Condition column contained either PPD or SEB, we would need to provide that argument as a vector, placing both within `c()`/ +::: +::: + +::: {.fragment} +```{r} +Data |> filter(Condition %in% c("PPD", "SEB")) |> head(10) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we could have set up the vector externally, and then provided it to `filter()` +::: +::: + +::: {.fragment} +```{r} +TheseConditions <- c("PPD", "SEB") +Data |> filter(Condition %in% TheseConditions) |> head(10) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +While this works when we have a limited number of variant condition values, what if had many more but only wanted to exclude one value? +As we saw when learning about [Conditionals](/course/02_FilePaths/index.qmd), when we add a ! in front of a logical value, we get the opposite logical value returned +::: +::: + +::: {.fragment} +```{r} +IsThisASpectralInstrument <- TRUE + +!IsThisASpectralInstrument +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In the context of the `dplyr` package, we can use ! within the `filter()` to remove rows that contain a certain value +::: +::: + +::: {.fragment} +```{r} +Subset <- Data |> filter(!Condition %in% "SEB") +Subset |> pull(Condition) |> unique() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Likewise, we can also use it with the `select()` to exclude columns we don't want to include +::: +::: + +::: {.fragment} +```{r} +Subset <- Data |> select(!timepoint) +Subset[1:3,] +``` + +::: + +--- + + +## mutate + +::: {.fragment} +::: {.callout-tip title="."} +As we can see, with just these handful of functions, we have the building blocks to rearrange and subset a larger data.frame into a format that we prefer. But what if we wanted to alter the content of a column, or add new columns to an existing data.frame? This is where the `mutate()` function can be used. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's start by slimming down our current Data to a smaller workable example, highlighting the functions and pipes we learned about today +::: +::: + +::: {.fragment} +```{r} +TidyData <- Data |> filter(Condition %in% "Ctrl") |> filter(timepoint %in% "0") |> + select(bid, timepoint, Condition, Date, Tcells_count, CD45_count) |> + rename(specimen=bid, condition=Condition) |> relocate(Date, .after=specimen) +``` + +::: + +--- + +::: {.fragment} +```{r} +TidyData +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The `mutate()` function can be used to modify existing columns, as well as to create new ones. For example, let's derrive the proportion of T cells from the overall CD45 gate. To do so, within the parenthesis, we would specify a new column name, and then divide the original columns: +::: +::: + +::: {.fragment} +```{r} +TidyData <- TidyData |> mutate(Tcells_ProportionCD45 = Tcells_count / CD45_count) +TidyData +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can see that we have many significant digits being returned. Let's round this new column to 2 significant digits by applying the `round()` function +::: +::: + +::: {.fragment} +```{r} +TidyData <- TidyData |> mutate(TcellsRounded = round(Tcells_ProportionCD45, 2)) +TidyData +``` + +::: + +--- + + +## arrange + +::: {.fragment} +::: {.callout-tip title="."} +And while we are here, let's rearrange the rows so that they are descending based on the Tcell proportion. We can use this by using the `desc()` and `arrange()` functions from `dplyr`: +::: +::: + +::: {.fragment} +```{r} +TidyData <- TidyData |> arrange(desc(TcellsRounded)) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And let's go ahead and `filter()` and identify the specimens that had more than 30% T cells as part of the overall CD45 gate (context, these samples were Cord Blood): +::: +::: + +::: {.fragment} +```{r} +TidyData |> filter(TcellsRounded > 0.3) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which is we had wanted to just retrieve the specimen IDs, we could add `pull()` after a new pipe argument. +::: +::: + +::: {.fragment} +```{r} +TidyData |> filter(TcellsRounded > 0.3) |> pull(specimen) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And finally, since I may want to send the data to a supervisor, let's go ahead and export this "tidyed" version of our data.frame out to it's own .fcs file. Working within our project folder, this would look like this: +::: +::: + +::: {.fragment} +```{r} +NewName <- paste0("MyNewDataset", ".csv") +StorageLocation <- file.path("data", NewName) +StorageLocation +``` +::: + +::: {.fragment} +```{r} +#| eval: FALSE +write.csv(TidyData, StorageLocation, row.names=FALSE) +``` +::: + +--- + +# Take Away + +::: {.fragment} +::: {.callout-tip title="."} +In this session, we explored the main functions within the `dplyr` package used in context of "tidying" data, including selecting columns, filtering for rows, as well as additional functions used to create or modify existing values. We will continue to build on these throughout the course, introducing a few additional tidyverse functions we don't have time to cover today as appropiate. As we saw, knowing how to use these functions can allow us to extensively and quickly modify our existing exported data files. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On important goal as we move through the course (in terms of both reproducibility and replicability) is to attempt to only modify files within R, not go back to the original csv or excel file and hand-modify individual values. This approach is not reproducible or replicable. Once set up, an R script can quickly re-carry out these same cleanup steps, and leave a documented process of how the data has changed (even more so if you are maintaining version control). If you do want to save the changes you have made, it is best to save it out as a new .csv file with which you work later. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next week, we will be using these skills when setting up metadata for our .fcs files. We will additionally take a look at the main format source of controversy within Bioconductor Flow Cytometry packages, ie. whether to use a flowframe or a cytoframe. Exciting stuff, but important information to know as the functions needed to import them are slightly different. We will also look at how to import existing manually gated .wsp from FlowJo/Diva/Floreada in via the `CytoML` package. +::: +::: + +--- + +![](images/TakeAway.jpg) + +--- + +# Additional Resources + +[Data Organization in Spreadsheets for Ecologists](https://datacarpentry.github.io/spreadsheet-ecology-lesson/) This Carpentry self-study course was one of my "Aha" moments early on when learning R, and reinforced the need to try to keep my own Excel/CSV files in a tidy manner. It is worth the time going through in its entirety (even for non-Ecologist). + +[Data Analysis and Visualization in R for Ecologists](https://datacarpentry.github.io/R-ecology-lesson/) Continuation of the above, and a good way to continue building on the tidyverse functions we learned today. + +--- + +[Simplistics: Introduction to Tidyverse in R](https://youtu.be/Bg4qxVNaDck?si=QPQq8TzOZ1w6XSy4) The YouTube channel is mainly focused on statistics for Psych classes, but at the end of the day, we are all working with similar objects with rows and columns, just the values contained within differ. + +[Riffomonas Project Playlist: Data Manipulation with R's Tidyverse](https://youtube.com/playlist?list=PLmNrK_nkqBpKf7j_ewpUm-w33R6PJYtD9&si=BVmDZPIXjRuHjERP) Riffomonas has a playlist that delves into both the tidyverse functions we used today, as well as other ones we will encounter later on in the course. + +--- + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} +Taking a dataset (either todays or one of your own), work through the column-operating functions (`select()`, `rename()`, and `relocate()`). Once this is done, `filter()` by conditions from two separate columns, arrange in an order that makes sense, and export this "tidy" data as a .csv file. +::: + +--- + +:::{.callout-tip title="Problem 2"} +We used the `mutate()` function to create new columns, but it can also be used to modify existing ones. Various numeric columns are showing way to many significant digits. As was shown, use `round()` to round all these proportion columns, but use mutate to overwrite the existing column. Export this as it's own .csv file. +::: + +--- + +:::{.callout-tip title="Problem 3"} +We can also use `mutate()` to combine columns. For our dataset, "bid", "timepoint", "Condition" are separate columns that originally were all part of the filename for the individual .fcs file. Try to figure out a way to combine them back together using `paste0()`, and save the new column as "filename". Once this is done, `pull()` the contents of this column, and using try to determine whether there were any duplicates (think innovative ways of using !, `length()` and `unique()`) +::: + +--- + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: \ No newline at end of file diff --git a/course/05_GatingSets/index.qmd b/course/05_GatingSets/index.qmd index 42f682a..65b2823 100644 --- a/course/05_GatingSets/index.qmd +++ b/course/05_GatingSets/index.qmd @@ -13,9 +13,11 @@ toc-depth: 5 [![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) ::: -For the YouTube livestream schedule, see [here](https://www.youtube.com/@cytometryinr) +For the YouTube livestream recording, see [here](https://youtu.be/x0SbK6PZF6Y?t=262) -For screen-shot slides, click [here]() + + +For screen-shot slides, click [here](/course/05_GatingSets/slides.qmd)
@@ -75,7 +77,8 @@ library(flowCore) ``` ```{r} -flowFrame <- read.FCS(filename=fcs_files[1], truncate_max_range = FALSE, transformation = FALSE) +flowFrame <- read.FCS(filename=fcs_files[1], truncate_max_range = FALSE, + transformation = FALSE) flowFrame ``` @@ -107,14 +110,16 @@ str(fcs_files) Consequently, we will need to use another function if we want to read in multiple .fcs files at once. For `flowCore`, this function is the `read.flowSet()` function. ```{r} -flowSet <- read.flowSet(files=fcs_files, truncate_max_range = FALSE, transformation = FALSE) +flowSet <- read.flowSet(files=fcs_files, truncate_max_range = FALSE, + transformation = FALSE) flowSet ``` Alternatively, we can designate specific files within "fcs_files" we want to read in using the [] and c() notation style we have encountered previously. ```{r} -read.flowSet(files=fcs_files[c(1, 3:4)], truncate_max_range = FALSE, transformation = FALSE) +read.flowSet(files=fcs_files[c(1, 3:4)], + truncate_max_range = FALSE, transformation = FALSE) ``` On follow-up, we can see that `read.flowSet()` has created a "flowSet" class object. @@ -149,7 +154,7 @@ While not today's focus, remember we could access individual components inside t Both "flowFrame" and "flowSet" objects were implemented in the `flowCore` package, which is the [oldest](/course/03_InsideFCSFile/#flowcore) extant flow cytometry R package on [Bioconductor](https://www.bioconductor.org/packages/release/bioc/html/flowCore.html). Consequently, a large proportion of the other flow cytometry R packages read in .fcs files as "flowFrame" and "flowSet" objects. -One consideration of this method is the contents of your .fcs files are read into your computer's random access memory [(RAM)](https://en.wikipedia.org/wiki/Random-access_memory). While for individual .fcs files or small experiments this present a problem for most modern computers, when working with large spectral flow cytometry files containing millions of events (or trying to analyze many .fcs files at once), you may encounter situations where you can quickly exceed your computers available RAM. +One consideration of this method is the contents of your .fcs files are read into your computer's random access memory [(RAM)](https://en.wikipedia.org/wiki/Random-access_memory). While for individual .fcs files or small experiments this will not present a problem for most modern computers, when working with large spectral flow cytometry files containing millions of events (or trying to analyze many .fcs files at once), you may encounter situations where you can quickly exceed your computers available RAM. To build some contextual understanding of the problem, let's learn how to check how much memory is being used by our individual variables/objects within our R session. We will primarily use the `lobstr` R packages `obj_size()` function, as it better handles evaluating complicated objects than base R's `object.size()` function. @@ -176,16 +181,17 @@ If we were curious how much memory total we are using within R at the current mo mem_used() ``` -Ultimately, how many .fcs files you are able to read in and interact with before running out of available RAM memory space will be dictated by your individual computers hardware configuration. You can check programmatically how much RAM you have available, although the specific function you will need to use will depend on your computer's operating system. +Ultimately, how many .fcs files you are able to read in and interact with before running out of available RAM memory space will be dictated by your individual computers hardware configuration. There are various ways you can check programmatically how much RAM your computer has available, although the specific functions will vary depending on your computers operating system, since they often involve system-level code outside R. Using the `ps` R package's `ps_system_memory()` function is one of the easier ways for Windows users. To simplify the process, here is an additional example of where a [conditional](/course/02_FilePaths/index.qmd#conditionals) can prove useful, allowing us to check in an operating system specific manner. It takes the output of the `Sys.info()` function, namely the "sysname" argument and then retrieves the relavent function. ```{r} - OperatingSystem <- Sys.info()[["sysname"]] if (OperatingSystem == "Windows") { # Windows - memory.limit() + Memory <- ps::ps_system_memory() + message("Total GB ", round(Memory$total / 1024^3, 2)) + message("Free GB ", round(Memory$free / 1024^3, 2)) } else if (OperatingSystem == "Darwin") { # MacOS system("top -l 1 | grep PhysMem") @@ -196,8 +202,13 @@ if (OperatingSystem == "Windows") { # Windows } else {message("A wild FreeBSD-User appears")} ``` -When evaluating the returned outputs, primarily consider the total, used and free outputs. - +```{r} +# install.packages("ps") # CRAN +library(ps) +Memory <- ps::ps_system_memory() +message("Total GB ", round(Memory$total / 1024^3, 2)) +message("Free GB ", round(Memory$free / 1024^3, 2)) +``` ## cytoframe diff --git a/course/05_GatingSets/slides.qmd b/course/05_GatingSets/slides.qmd new file mode 100644 index 0000000..51f3032 --- /dev/null +++ b/course/05_GatingSets/slides.qmd @@ -0,0 +1,1413 @@ +--- +title: "05 - Gating Sets" +author: "David Rach" +date: 03-03-2026 +format: + revealjs: + theme: default + slide-number: true + incremental: true +page-layout: full +execute: + echo: true + warning: false + message: false +--- + +![](/images/WebsiteBanner.png) + +::: {style="text-align: right;"} +[![AGPL-3.0](https://img.shields.io/badge/license-AGPLv3-blue)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](http://creativecommons.org/licenses/by-sa/4.0/) +::: + +--- + +# Background + + +::: {.fragment} +::: {.callout-tip title="."} +Welcome to the fifth week of the Cytometry in R course!!! At this point, we are through a significant portion of the "Intro to R" material, and will start encountering more "Cytometry-focused" material moving forward. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +If we think of a typical flow cytometry experiment, there is more to the analysis than simply acquiring the .fcs file. While there is [substantial information](/course/03_InsideFCSFile/) present within an .fcs file, in the context of analyzing them with commercial software, we rely on additional infrastructural elements to organize the various files, transform (scale), compensate (for conventional flow), visualize, derrive statistics, etc. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This infrastructural requirement within the R context is primarily handled by the `flowCore` and `flowWorkspace` R packages from [Bioconductor](https://www.bioconductor.org/). Today, we will build on what we learned during [Week 03](/course/03_InsideFCSFile/index.qmd) but in the context of working and interacting with multiple .fcs files. This will provide a solid foundation to explore in greater depth how individual components of our typical workflow are represented within the R context. +::: +::: + +--- + +# Walk Through + +:::{.callout-important title="Housekeeping"} +As we do [every week](/course/02_FilePaths/index.qmd), on GitHub, [sync](/course/00_Homeworks/index.qmd#sync-your-fork) your forked version of the CytometryInR course to bring in the most recent updates. Then within Positron, [pull](/course/00_Homeworks/index.qmd#pull-to-local) in those changes to your local computer. + +After [setting up](/course/00_Git/index.qmd#new-folder-from-template) a "Week05" project folder, copy over the contents of "course/05_GatingSets/data" to that folder. This will hopefully prevent merge issues next week when attempting to pull in new course material. Once you have your new project folder organized, remember to [commit](/course/00_Git/index.qmd#push) and push your changes to GitHub to maintain remote version control. + +If you encounter issues syncing due to the Take-Home Problem merge conflict, see this [walkthrough](https://umgcccfcsr.github.io/CytometryInR/course/00_BonusContent/PullConflicts/). The updated homework submission protocol can be found [here](https://umgcccfcsr.github.io/CytometryInR/course/00_BonusContent/PullConflicts/UpdatedPullRequest) +::: + +
+ +--- + +## flowFrame + + +::: {.fragment} +::: {.callout-tip title="."} +Let's start off by recalling the approach we first saw during [Week 03](/course/03_InsideFCSFile/index.qmd), where using the `flowCore` package we loaded the contents of our .fcs file into R as a "flowFrame" object. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To do this, we first identified the .fcs files we were interested using `file.path()` to specify the folder, and `list.files()` to find contents containing ".fcs". +::: +::: + +::: {.fragment} +```{r} +# Folder <- file.path("course", "05_GatingSets", "data") # For Testing + + Folder <- file.path("data") # For Quarto Rendering + +fcs_files <- list.files(Folder, pattern=".fcs", full.names=TRUE) + +fcs_files +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We then identified an individual .fcs file of interest using the [] method of indexing. +::: +::: + +::: {.fragment} +```{r} +fcs_files[1] +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Then, after making sure flowCore was attached to our local environment (via the `library()` function), we could use `read.FCS()` to read in our .fcs files contents to R. +::: +::: + +::: {.fragment} +```{r} +# BiocManager::install("flowCore") #Bioconductor +library(flowCore) +``` + +::: + +::: {.fragment} +```{r} +flowFrame <- read.FCS(filename=fcs_files[1], truncate_max_range = FALSE, + transformation = FALSE) +flowFrame +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we start to think about the wider infrastructural handling of our .fcs files, what would have occurred if we had provided multiple .fcs file paths to `read.FCS()`? Let's go ahead and check by not providing an index number. +::: +::: + +::: {.fragment} +```{r} +#| error: TRUE +read.FCS(filename=fcs_files, truncate_max_range = FALSE, transformation = FALSE) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As you can tell, this error message is not particularly interpretable. It however arises from type of object we are passing to the function, whereby an individual file.path (fcs_files[1]) appears as class "character" with a **single value** (ie. a [scalar](https://nathanieldphillips-yarrr.share.connect.posit.cloud/scalars.html)), but the combined vector (fcs_files) contains **multiple** values. +::: +::: + +::: {.fragment} +```{r} +fcs_files[1] + +str(fcs_files[1]) +``` + +::: + +::: {.fragment} +```{r} +fcs_files + +str(fcs_files) +``` + +::: + +--- + +## flowSet + +::: {.fragment} +::: {.callout-tip title="."} +Consequently, we will need to use another function if we want to read in multiple .fcs files at once. For `flowCore`, this function is the `read.flowSet()` function. +::: +::: + +::: {.fragment} +```{r} +flowSet <- read.flowSet(files=fcs_files, truncate_max_range = FALSE, + transformation = FALSE) +flowSet +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, we can designate specific files within "fcs_files" we want to read in using the [] and c() notation style we have encountered previously. +::: +::: + +::: {.fragment} +```{r} +read.flowSet(files=fcs_files[c(1, 3:4)], + truncate_max_range = FALSE, transformation = FALSE) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +On follow-up, we can see that `read.flowSet()` has created a "flowSet" class object. +::: +::: + +::: {.fragment} +```{r} +class(flowSet) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which we can also confirm by glancing at the right secondary sidebar to see the created Variables within our environment. Applying our investigatory skills from [Week 3](/course/03_InsideFCSFile/index.qmd), we surmise that "flowSet" is another Bioconductor style S4-type object that within its frame slot contains individual "flowFrames". +::: +::: + +::: {.fragment} +![](images/00_FlowSet.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If instead of `class()` we had used `str()`, we would have seen a similar output ton what we see in the Variables panel. +::: +::: + +::: {.fragment} +```{r} +str(flowSet) +``` + +::: + +--- + +:::{.callout-tip title="Reminder"} +While not today's focus, remember we could access individual components inside the flowSet using the @ accessors covered during [Week 3](/course/03_InsideFCSFile/index.qmd) +::: + +--- + +## Memory Usage + +::: {.fragment} +::: {.callout-tip title="."} +Both "flowFrame" and "flowSet" objects were implemented in the `flowCore` package, which is the [oldest](/course/03_InsideFCSFile/#flowcore) extant flow cytometry R package on [Bioconductor](https://www.bioconductor.org/packages/release/bioc/html/flowCore.html). Consequently, a large proportion of the other flow cytometry R packages read in .fcs files as "flowFrame" and "flowSet" objects. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +One consideration of this method is the contents of your .fcs files are read into your computer's random access memory [(RAM)](https://en.wikipedia.org/wiki/Random-access_memory). While for individual .fcs files or small experiments this will not present a problem for most modern computers, when working with large spectral flow cytometry files containing millions of events (or trying to analyze many .fcs files at once), you may encounter situations where you can quickly exceed your computers available RAM. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To build some contextual understanding of the problem, let's learn how to check how much memory is being used by our individual variables/objects within our R session. We will primarily use the `lobstr` R packages `obj_size()` function, as it better handles evaluating complicated objects than base R's `object.size()` function. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can check and see the memory usage by our flowFrame object +::: +::: + +::: {.fragment} +```{r} +# Base R +object.size(flowFrame) + +# install.packages("lobstr") # CRAN +library(lobstr) +obj_size(flowFrame) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And contrast to the greater ammount of space occupied by our flowSet object (which contains multiple flowFrames) +::: +::: + +::: {.fragment} +```{r} +obj_size(flowSet) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If we were curious how much memory total we are using within R at the current moment, we can check using the `mem_used()` function: +::: +::: + +::: {.fragment} +```{r} +mem_used() +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Ultimately, how many .fcs files you are able to read in and interact with before running out of available RAM memory space will be dictated by your individual computers hardware configuration. There are various ways you can check programmatically how much RAM your computer has available, although the specific functions will vary depending on your computers operating system, since they often involve system-level code outside R. Using the `ps` R package's `ps_system_memory()` function is one of the easier ways for Windows users. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To simplify the process, here is an additional example of where a [conditional](/course/02_FilePaths/index.qmd#conditionals) can prove useful, allowing us to check in an operating system specific manner. It takes the output of the `Sys.info()` function, namely the "sysname" argument and then retrieves the relavent function. +::: +::: + +::: {.fragment} +```{r} + +OperatingSystem <- Sys.info()[["sysname"]] + +if (OperatingSystem == "Windows") { # Windows + # install.packages("ps") # CRAN + Memory <- ps::ps_system_memory() + message("Total GB ", round(Memory$total / 1024^3, 2)) + message("Free GB ", round(Memory$free / 1024^3, 2)) + + } else if (OperatingSystem == "Darwin") { # MacOS + system("top -l 1 | grep PhysMem") + + } else if (OperatingSystem == "Linux") { # Linux + system("free -h") + + } else {message("A wild FreeBSD-User appears")} +``` + +::: + +--- + +::: {.fragment} +```{r} +# install.packages("ps") # CRAN +library(ps) +Memory <- ps::ps_system_memory() +message("Total GB ", round(Memory$total / 1024^3, 2)) +message("Free GB ", round(Memory$free / 1024^3, 2)) +``` + +::: + +--- + +## cytoframe + +::: {.fragment} +::: {.callout-tip title="."} +In addition to the `flowCore` R package, additional flow cytometry infrastructure support is provided by the `flowWorkspace` package. Instead of the reading all the .fcs files contents into active RAM, `flowWorkspace` reduces the memory overhead by using ["pointers"](https://www.geeksforgeeks.org/c/c-pointers/) to interact with the object in it's current storage location (either on your harddrive, SSD, etc.), only reading in components to RAM as needed. +::: +::: + +::: {.fragment} +```{r} +# BiocManager::install("flowWorkspace") #Bioconductor +library(flowWorkspace) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Because of these differences in how data is interracted with, we end up with parallel equivalents to the traditional flowFrame and flowSet type objects. These include "cytoframe" for single .fcs files +::: +::: + +::: {.fragment} +```{r} +cytoframe <- load_cytoframe_from_fcs(fcs_files[1], truncate_max_range = FALSE, transformation = FALSE) + +cytoframe +``` + +::: + +--- + +::: {.fragment} +```{r} +class(cytoframe) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Which also still errors out when not given a scalar object +::: +::: + +::: {.fragment} +```{r} +#| error: TRUE + +load_cytoframe_from_fcs(fcs_files, truncate_max_range = FALSE, transformation = FALSE) +``` + +::: + +--- + +## cytoset + +::: {.fragment} +::: {.callout-tip title="."} +As well as "cytoset" to handle multiple .fcs files. +::: +::: + +::: {.fragment} +```{r} +cytoset <- load_cytoset_from_fcs(fcs_files, truncate_max_range = FALSE, transformation = FALSE) + +cytoset +``` + +::: + +::: {.fragment} +```{r} +class(cytoset) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Unlike "flowFrame" and "flowSet", when we run `str()`, for "cytoframe" and "cytoset" objects we don't get back quite as much information. +::: +::: + +::: {.fragment} +```{r} +str(cytoframe) +``` + +::: + +--- + +::: {.fragment} +```{r} +str(cytoset) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is similarly the case when glancing at the right secondary side bar, as the respective objects under variables appear to have empty matrices where normally we would have seen the MFI values. +::: +::: + +::: {.fragment} +![](images/01_LookMaNoData.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Due to `flowWorkspace` use of pointers, the missing data remains stored on the drive, only being retrieved right before it is required. This reduces the overall RAM utilization. Let's double check the differences in memory utilization for flowFrame/cytoframe: +::: +::: + +::: {.fragment} +```{r} +obj_size(flowFrame) +``` + +::: + +::: {.fragment} +```{r} +obj_size(cytoframe) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +And similarly the case for flowSet and cytoset: +::: +::: + +::: {.fragment} +```{r} +obj_size(flowSet) +``` + +::: + +::: {.fragment} +```{r} +obj_size(cytoset) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Additionally, with computer hardware increasingly switching from spinning disk hard-drives to faster [solid state](https://unihost.com/help/nvme-vs-ssd-vs-hdd-overview-and-comparison/) drives, the performance penalty previously experienced when not running from RAM is not as large of a concern as in previous years. +::: +::: + +--- + +## Interconverting + +::: {.fragment} +::: {.callout-tip title="."} +Despite both R packages having been around for a while, many [Bioconductor](https://www.bioconductor.org/packages/release/BiocViews.html#___FlowCytometry) and [GitHub](https://github.com/stars/DavidRach/lists/cytometry-r-packages) often only implement methods to handle either flowFrames or cytoframes (although newer R packages are now allowing for both). Consequently, as we move forward in the course, it helps to be aware of which ones we are working with, and have the ability to interconvert between them as needed. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To go from a flowFrame to a cytoframe, we can use the `flowFrame_to_cytoframe()` function +::: +::: + +::: {.fragment} +```{r} +ConvertedToCytoframe <- flowFrame_to_cytoframe(flowFrame) +ConvertedToCytoframe +``` + +::: + +--- + +::: {.fragment} +```{r} +obj_size(ConvertedToCytoframe) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To go from a cytoframe to a flowFrame, we can use the `cytoframe_to_flowFrame()` function +::: +::: + +::: {.fragment} +```{r} +ConvertedToFlowframe <- flowWorkspace::cytoframe_to_flowFrame(cytoframe) +ConvertedToFlowframe +``` + +::: + +--- + +::: {.fragment} +```{r} +obj_size(ConvertedToFlowframe) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To go from a flowSet to a cytoSet, we can use the `flowSet_to_cytoset()` funciton +::: +::: + +::: {.fragment} +```{r} +ConvertedToCytoset <- flowSet_to_cytoset(flowSet) +ConvertedToCytoset +``` + +::: + +::: {.fragment} +```{r} +obj_size(ConvertedToCytoset) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To go from a cytoSet to a flowSet, we can use the `cytoset_to_flowSet()` function. +::: +::: + +::: {.fragment} +```{r} +ConvertedToFlowset <- cytoset_to_flowSet(flowSet) +ConvertedToFlowset +``` + +::: + +::: {.fragment} +```{r} +obj_size(ConvertedToFlowset) +``` + +::: + +--- + +## Gating Sets + +::: {.fragment} +::: {.callout-tip title="."} +Fortunately, regardless of whether we are using flowFrame/flowSet (RAM) and cytoframe/cytoset (memory pointers), both routes end up converging at the next step, where the underlying .fcs files are passed off to the `GatingSet()` function. +::: +::: + +::: {.fragment} +```{r} +GatingSet1 <- GatingSet(flowSet) +GatingSet1 +``` + +::: + +::: {.fragment} +```{r} +class(GatingSet1) +``` + +::: + +--- + +::: {.fragment} +```{r} +GatingSet2 <- GatingSet(cytoset) +GatingSet2 +``` + +::: + +::: {.fragment} +```{r} +class(GatingSet1) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As we prefaced in the [background](/course/05_GatingSets/index.qmd#background), beyond the .fcs files themselves, we need infrastructural elements with which to interact with the underlying data, which allows us to organize the various files, transform (scale), compensate (for conventional flow), visualize, derrive statistics, etc. A GatingSet serves as the infrastructural framework that allows us to do this in R. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +If we investigate our current GatingSet objects, we won't see much +::: +::: + +::: {.fragment} +![](images/03_GatingSetConvergence.png) +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This will change as we start layering on additional elements. However, rather than try to cram everything into a single week, we will explore in greater depth the individual components over the next [three weeks](/Schedule.qmd#applying-transformations-and-compensation). Instead, for the rest of today, we will work backward, by exploring a GatingSet objecct and what it is capable of doing once fully assembled. +::: +::: + +--- + +## CytoML + +::: {.fragment} +::: {.callout-tip title="."} +The `CytoML` R package (also maintained by [Mike Jiang](https://github.com/mikejiang)) is a sister package to the `flowWorkspace`. It's main purpose is to permit bringing in existing FlowJo, Diva and Cytobank Workspaces, with all their gates, transformations, etc. into R as fully assembled GatingSet objects. For those who already use one of these commercial softwares, it can be quite useful tool. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +Since our goal is to examine a fully assembled GatingSet object, we will be using it today to bring in a [FlowJo](https://www.flowjo.com/flowjo10/overview) workspace to R. However, since this is a free Cytometry in R course, and not about to have everyone pay for a license for a one-off topic, in the [pre-course Floreada](/course/00_Floreada/index.qmd) walkthrough I documented how to convert a free [Floreada.io](https://floreada.io/) workspae into a FlowJo.wsp that can also be used (please note that as of early 2026, some scaling bugs may be present and require troubleshooting). +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +To get started, let's first attach `CytoML` to our local environment via the `library()` call. +::: +::: + +::: {.fragment} +```{r} +# BiocManager::install("CytoML") #Bioconductor +library(CytoML) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The .wsp files within this week's data where created via [Floreada.io](/course/00_Floreada/index.qmd). The main difference between the two files is one is a copy of the original that was opened within FlowJo, and subsequently swtiched from [logicle](https://pubmed.ncbi.nlm.nih.gov/16604519/) to [bi-exponential](https://docs.flowjo.com/flowjo/graphs-and-gating/gw-transform-overview/gw-transform-benefits/) transformation. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +We will need to provide the appropiate file path for our desired .wsp file. We can start by identifying which are present using `list.files()` +::: +::: + +::: {.fragment} +```{r} +Folder # Defined Above +FlowJoWsp <- list.files(path = Folder, pattern = ".wsp", full = TRUE) +FlowJoWsp +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In our case, we will proceed by using `str_detect()` to select the .wsp that contains the pattern "Opened" +::: +::: + +::: {.fragment} +```{r} +ThisWorkspace <- FlowJoWsp[stringr::str_detect(FlowJoWsp, "Opened")] +ThisWorkspace +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +With our single .wsp filepath now identified, we can now proceed to set up the intermediate object using `open_flowjo_xml()` +::: +::: + +::: {.fragment} +```{r} +ws <- open_flowjo_xml(ThisWorkspace) +ws +``` + +::: + +::: {.fragment} +```{r} +class(ws) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Having set up the intermediate flowjo_workspace object, we can attempt to read in the actual data from the .wsp into a GatingSet using the `flowjo_to_gatingset()` function. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +However, due to how I named the original .fcs files ("GROUPNAME" being individual specimens, "TUBENAME" being either Ctrl or SEB), and downsampled to the same number of cells, we will encounter the following error +::: +::: + +::: {.fragment} +```{r} +#| error: TRUE +gs <- flowjo_to_gatingset(ws=ws, name=1, path = Folder) +gs +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As with any error, my first move is to check the help documentation. In this case, my initial response is to see if I can identify an argument that will help differentiate between the names for each specimen. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +?flowjo_to_gatingset +``` + +::: + +--- + +![](images/CytoMLArguments.png) + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +In this case, I find that the "additional.keys" argument would likely work for this troubleshooting +::: +::: + +--- + +![](images/AdditionalKeys.png) + +--- + +::: {.fragment} +```{r} +gs <- flowjo_to_gatingset(ws=ws, name=1, path = Folder, additional.keys="GROUPNAME") +gs +``` + +::: + +::: {.fragment} +```{r} +class(gs) +``` + +::: + +--- + +## System Time + +::: {.fragment} +::: {.callout-tip title="."} +Especially when working with CytoML, it is often good to have an idea of how long it will take a particular function to run (to better plan how to use our time while waiting, whether to go grab coffee, etc.). There are a couple ways to do so. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +One, using the `system.time()` function from base R, in which we surround whatever line of code we wish to evaluate in {} +::: +::: + +::: {.fragment} +```{r} +system.time({ + +flowjo_to_gatingset(ws=ws, name=1, path = Folder, additional.keys="GROUPNAME") + +}) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, if we install the `bench` package, we can use the `mark` function to evaluate how long it takes on average across numerous iterations. +::: +::: + +::: {.fragment} +```{r} +# install.packages("bench") # CRAN +library(bench) +``` + +::: + +::: {.fragment} +```{r} +mark( + Test <- flowjo_to_gatingset(ws=ws, name=1, path = Folder, additional.keys="GROUPNAME"), + iterations= 5 + ) +``` + +::: + +--- + +## Gates + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have loaded the contents of the FlowJo/Floreada workspace, we can start exploring the various infrastructural capabilities of a GatingSet object. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Let's start by evaluating whether the manually-drawn gates I drew survived the journey. To do this, I can generate a visual gating treee using the `plot()` function. +::: +::: + +::: {.fragment} +```{r} +plot(gs) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +We can also retrieve the individual gates and their gaing paths using the `gs_get_pop_paths()` function. +::: +::: + +::: {.fragment} +```{r} +gs_get_pop_paths(gs) +``` + +::: + +--- + +## Counts + +::: {.fragment} +::: {.callout-tip title="."} +If we wanted to retrieve counts of cells found within the individual gates, we could do so with `gs_pop_get_count_fast()` +::: +::: + +::: {.fragment} +```{r} +Data <- gs_pop_get_count_fast(gs) +head(Data, 5) +``` + +::: + +--- + +## Metadata + +::: {.fragment} +::: {.callout-tip title="."} +Since GatingSets contain multiple .fcs files, we may want to be able to subset them based on metadata for a particular variable. We can check to see current metadata using the `pData()` function. +::: +::: + +::: {.fragment} +```{r} +pData(gs) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +It currently doesn't have much, but we will explore how to change this more over the next few weeks. For now, just know that we could add additional metadata via either a .csv file, or by retrieving additional description keywords from within the .fcs files themselves (as shown below) +::: +::: + +::: {.fragment} +```{r} +AlternateGS <- flowjo_to_gatingset(ws=ws, name=1, path = Folder, + additional.keys="GROUPNAME", + keywords=c("$DATE", "$CYT", "GROUPNAME")) +pData(AlternateGS) +``` + +::: + +--- + +## ggcyto + +::: {.fragment} +::: {.callout-tip title="."} +As you can surmise, a lot of the infrastructural style handling done by commercial softwares is being orchestrated/mediated through our GatingSet object. Since it's able to create and retain gating information, how would we go about visualizing the underlying data contained within each? +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Within R, most plots are generated using the `ggplot2` package from the tidyverse (which we will explore [next week](/Schedule.qmd#visualizing-with-ggplot2)), which builds of the ["Grammar of Graphics"](https://vita.had.co.nz/papers/layered-grammar.html) concept, combining [layers](https://friendly.github.io/6135/lectures/ggplot-intro.pdf) together to create the final plots. The Bioconductor `ggcyto` R package extends this concept to enable flow cytometry data contained within a GatingSet to be plotted. +::: +::: + +--- + +:::{.callout-important} + +As is the case with most free open-source software ([FOSS](https://en.wikipedia.org/wiki/Free_and_open-source_software)), R packages will change over time as their developers add new features, make improvements, or alter internal functions to speed things up. + +::: + + +:::{.callout-important} + +ggplot2 recently had a major [version](/course/01_InstallingRPackages/index.qmd#installing-specific-package-versions) change, with [significant](https://tidyverse.org/blog/2025/09/ggplot2-4-0-0/) internal changes occuring. As a consequence of these changes, `ggcyto` functions that relied on the old `ggplot2` functions [broke](https://github.com/RGLab/ggcyto/pull/103) and had to be [updated](https://github.com/RGLab/ggcyto/pull/110). + +::: + +--- + +:::{.callout-important} + +Any updates to CRAN packages are reflected immediately. By contrast, Bioconductor is on a twice yearly [release cycle](https://www.bioconductor.org/developers/release-schedule/), so to take advantage of the `ggcyto` "fixes" that allow it to interact with the new version of `ggplot2`, we will need to make sure we have the "developmental" version installed. + +::: + +--- + +### packageVersion + +::: {.fragment} +::: {.callout-tip title="."} +Let's start off by checking what version of both the `ggplot2` and `ggcyto` packages you currently have installed on your computer. +::: +::: + +::: {.fragment} +```{r} +packageVersion("ggplot2") +``` + +::: + +::: {.fragment} +```{r} +packageVersion("ggcyto") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you were able to retrieve the following package versions (or greater") for `ggplot2` and `ggcyto`, you should be all set and can skip the subsequent reinstallation steps. +::: +::: + +--- + +![](images/20_PackageVersion.png) + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you however found you have the older package versions (ex. ggplot2 3.5.2 or ggcyto 1.37.1) currently installed, you will likely encounter errors when trying to run the functions to plot your data below (since the changes are not fully [backward-compatible](https://en.wikipedia.org/wiki/Backward_compatibility) with older versions). +::: +::: + +--- + +### remove.packages + +::: {.fragment} +::: {.callout-tip title="."} +Since `ggcyto` has a hard-coded dependency on ggplot2, if you have the older versions, I would recommend uninstaling both first, using the `remove.packages()` function. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +remove.packages("ggplot2") +remove.packages("ggcyto") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Once this is done, I recommend exiting and then reopening Positron. This will ensure all currently-loaded R packages are unattached from the environment. However, you will loose all your environmental variables, so will need to reload them to get back to this point. If you are working with code chunks inside a Quarto Markdown File (.qmd), you can quickly accomplish this by scrolling down to the point of the document where you left off, and selecting the "Run Above" option showin on the code chunk. +::: +::: + +--- + +![](images/RunAbove.png) + +--- + +### Installing correct versions + +::: {.fragment} +::: {.callout-tip title="."} +To reinstall `ggplot2`, you just need to install again from CRAN (as with it's [rolling-release](https://cran.r-project.org/web/packages/policies.html) model any changes the developers make become immediately available to everyone) +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +install.packages("ggplot2") +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +If you need to reinstall `ggcyto`, because of Bioconductor's twice yearly [release cycle](https://www.bioconductor.org/developers/release-schedule/), you will need to install the "developmental" version to take advantage of the fixes. Since this is for a one-off package, the easiest installation approach if to go via the [GitHub](/course/01_InstallingRPackages/index.qmd#install-from-github) using the `remotes` package's `install_github()` +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +remotes::install_github("RGLab/ggcyto") +``` + +::: + +--- + +## Plotting + +::: {.fragment} +::: {.callout-tip title="."} +Once you have the current versions of both `ggplot2` and `ggcyto`, we can proceed to attach them to your local environment via the `library()` function. +::: +::: + +::: {.fragment} +```{r} +library(ggplot2) +library(ggcyto) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +As was mentioned, `ggcyto` follows the `ggplot2` grammar of graphics syntax, which we will learn more extensively [next week](/Schedule.qmd#visualizing-with-ggplot2). For now, lets look at a simple example +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +ggcyto(gs[1], subset="root", aes(x="FSC-A", y="SSC-A")) + geom_hex(bins=100) +``` + +::: + +--- + + +::: {.fragment} +::: {.callout-tip title="."} +The function responsible for plotting is the `ggcyto()` function. The first argument ("gs[1]") is designating which .fcs file in our GatingSet we are trying to visualize. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +The second argument ("subset") corresponds to which gating node we want to visualize. In this case, when set to "root", we are seeing all cells present in the .fcs file. If we however wanted to visualize the cells within the CD4+ gate, we would swap the value provided to this argument. +::: +::: + +::: {.fragment} +```{r} +#| eval: FALSE +ggcyto(gs[1], subset="CD4+", aes(x="FSC-A", y="SSC-A")) + geom_hex(bins=100) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +The next argument "aes" stands for aesthetics (more on this [next week](/Schedule.qmd#visualizing-with-ggplot2)). You will notice it has its own set of parenthesis, in which we designate the markers/fluorophores we want to visualize on the x and y axis. +::: +::: + +::: {.fragment} +::: {.callout-tip title="."} +The final argument ("+ geom_hex(bins=100)") specifies we want to generate a flow cytometry style plot, with it's bin arguments value setting the resolution. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Now that we have walked through the arguments, let's visualize the data +::: +::: + +::: {.fragment} +```{r} +#| eval: TRUE +ggcyto(gs[1], subset="CD4+", aes(x="FSC-A", y="SSC-A")) + geom_hex(bins=100) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Alternatively, if we switched things around +::: +::: + +::: {.fragment} +```{r} +ggcyto(gs[1], subset="CD8+", aes(x="IFNg", y="TNFa")) + geom_hex(bins=100) +``` + +::: + + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Briefly, if we didn't remember the marker, we could specify the fluorophore +::: +::: + +::: {.fragment} +```{r} +ggcyto(gs[1], subset="CD8+", aes(x="BV750-A", y="PE-Dazzle594-A")) + geom_hex(bins=100) +``` + +::: + +--- + +::: {.fragment} +```{r} +ggcyto(gs[6], subset="Tcells", aes(x="CD4", y="CD8")) + geom_hex(bins=100) +``` + +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +This is all we will cover for `ggcyto` for now, we will circle back over the [next couple weeks](/Schedule.qmd#applying-transformations-and-compensation) as we gain more familiarity with how to build our own GatingSet objects. If you want to jump ahead, please see the additional resources section and happy exploring! +::: +::: + +--- + +# Take Away + +::: {.fragment} +::: {.callout-tip title="."} +Today, we looked at the two main representations of flow cytometry data in R, the older `flowCore` implemented flowFrame/flowSet objects that are stored in RAM, and the `flowWorkspace` cytoFrame/cytoSet objects that operate through memory pointers. We started our learning journey to understand GatingSet objects, and how to use them to mediate/orchestrate in R many of the infrastructural steps that would normally be performed by commercial software. And finally, we briefly covered how to use the `ggcyto` to visualize data contained within our GatingSets. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Similar to our utilization of [tidyverse](/course/04_IntroToTidyverse/) functions last week, we will be using GatingSets continously throughout the rest of the course. Over the next few weeks we will instead of retrieving already assembled GatingSets via `CytoML` assemble them from scratch within R. +::: +::: + +--- + +::: {.fragment} +::: {.callout-tip title="."} +Next week, we will dive further into the `ggplot2` package from the tidyverse and how it implements the ["Grammar of Graphics"](https://vita.had.co.nz/papers/layered-grammar.html) concept. In the process, we will see how by combining [layers](https://friendly.github.io/6135/lectures/ggplot-intro.pdf) and changing various elements being added on to the base layers of the plot, we can end up with many different plots we normally encounter as cytometrist. +::: +::: + +--- + +![](images/SunsetSatzi.jpg) + +--- + +# Additional Resources + +[flowWorkspace Bioconductor Vignette](https://www.bioconductor.org/packages/release/bioc/vignettes/flowWorkspace/inst/doc/flowWorkspace-Introduction.html) The Bioconductor vignettes are always a good place to start with any of the Cytoverse packages, the vignette for `flowWorkspace` is no exception. If you want to understand more about how to subset cytosets, or the various functions and arguments in a GatingSet, this should be your first stop. + +[CytoML Bioconductor Vignette](https://www.bioconductor.org/packages/release/bioc/vignettes/CytoML/inst/doc/flowjo_to_gatingset.html) If you use FlowJo, Diva, or CytoBank routinely, and want to understand more about how to bring in your own experiments to R, the `CytoML` vignettes should be your next stop. + +--- + +[ggcyto Bioconductor Vignette](https://www.bioconductor.org/packages/release/bioc/vignettes/ggcyto/inst/doc/Top_features_of_ggcyto.html). There are several vignettes that can be found on the `ggcyto` Bioconductor [website](https://www.bioconductor.org/packages/release/bioc/html/ggcyto.html) on how to plot your flow cytometry data, this one surmize many of the points we will be covering over the next few weeks. + +[Bioc2023 Workshop: Reproducible and programmatic analysis of flow cytometry experiments with the cytoverse](https://youtu.be/_8x-prIxJgw?si=MhVVUJJdYEDI4JzV) Ozette hosted a workshop covering many of the cytoverse R packages at the Bioconductor conference (BioC) back in 2023. Some of the contents we will cover in greater depth over the next few weeks. + +--- + +# Take-home Problems + +:::{.callout-tip title="Problem 1"} + +Using what you learned last week in [Introduction to Tidyverse](/course/04_IntroToTidyverse/), for the imported GatingSet, retrieve the data.frame from cell counts per gate and attempt to mutate a new column showing percent of the parent gate. Remember, this is intentionally tricky at this point, we will go over how to efficiently do this in a [few weeks](/Schedule.qmd#retrieving-data-for-statistics) + +::: + +--- + +:::{.callout-tip title="Problem 2"} + +As we saw, `CytoML` can be finicky when names are repeated, or .fcs files are not present. Try removing a couple of the .fcs files from the data folder, and re-run the code. Document what kind of errors result. + +::: + +--- + +:::{.callout-tip title="Problem 3"} + +For `ggcyto`, attempt to generate plots to visualize TNFa and IFNg for the various cell populations, across both Ctrl and SEB samples. In the process, change the bins argument until you end up with a resolution that you would be happy with for your own plots, and write it down. + +::: + +--- + +![](images/SunsetSatzi.jpg) + +--- + +::: {style="text-align: right;"} +[![AGPL-3.0](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![CC BY-SA 4.0](https://licensebuttons.net/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) +::: \ No newline at end of file diff --git a/course/index.qmd b/course/index.qmd index 535ef6f..4263b3a 100644 --- a/course/index.qmd +++ b/course/index.qmd @@ -1,3 +1,49 @@ +<<<<<<< HEAD +--- +title: "Cytometry in R" +format: html +--- + +![](/images/WebsiteBanner.png) + +Cytometry in R is a free virtual mini-course being organized by the [Flow Cytometry Shared Resource](https://www.medschool.umaryland.edu/cibr/core/umgccc_flow/) Core at the [University of Maryland's Greenebaum Comprehensive Cancer Center](https://www.umms.org/umgccc). This course is a passion project arising from our desire to contribute back to the community. + +We are excited that so many individuals worldwide have chosen to take part, and we look forward to helping you get started on your own learning journeys. + +![](/images/WorldwideSignups.png){width=100%} + +# Participating + +The course will start the first week of February, with Week #1 resources being released on Sunday, February 1st at 2200 EST (Monday 0300 GMT+0). See below for additional details. + +## Resources + +The pre-course learning materials are now [available](/course/00_GitHub/index.qmd), providing walkthroughs of how to set up your workstations with the required software, and exercises to help you become more familiar with the various teaching and coding resources we will be using throughout the course. + +Narrated versions of the walk through materials are now also available via [YouTube](https://www.youtube.com/@CytometryInR) + + +## In-Person (Baltimore) + +For those joining us in person, the class is being offered on Monday, Tuesday and Thursday from **4-5 pm EST** in Bressler Research Building Room 7-035. We invite you to make whichever session best fits your schedule. Monitors to plug your laptops in will be available on a first come, first served basis. These in-person sessions will not be recorded, but with the smaller class size you will have our undivided attention should you have any questions. + +## Virtual (Worldwide) + +For those joining us virtually, we will have three separate livestreams throughout the week on [YouTube](https://www.youtube.com/@CytometryInR). These will be offered on: + +- Tuesday 2200 EST (Wednesday 0300 GMT+0) +- Wednesday 1600 EST (Wednesday 2100 GMT+0) +- Thursday 1000 EST (Thursday 1500 GMT+0) + +All three livestreams will be recorded and available on YouTube immediately afterwards. + +## Discussion Forum + +We will be using the Cytometry in R [Discussions page](https://github.com/UMGCCCFCSR/CytometryInR/discussions) as a community forum, and a place to ask questions, celebrate wins, and provide feedback. After creating a a [GitHub](/course/00_GitHub/index.qmd) account, pleae go introduce yourself. + + + +======= --- title: "Cytometry in R" format: html @@ -40,3 +86,4 @@ We will be using the Cytometry in R [Discussions page](https://github.com/UMGCC +>>>>>>> 23a81a59a64966e782d820f6b60f087d577c3b25 diff --git a/docs/ExistingResources.html b/docs/ExistingResources.html index a22c58e..ed61160 100644 --- a/docs/ExistingResources.html +++ b/docs/ExistingResources.html @@ -1,800 +1,800 @@ - - - - - - - - - -Existing Resources – Cytometry in R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - - - -
- -
-
-

Existing Resources

-
- - - -
- - - - -
- - - -
- - -

-
-

AGPL-3.0 CC BY-SA 4.0

-
-

We are not the first “Cytometry in R” course, nor will we be the last. This page is linking to the already existant online Cytometry in R resources that we have encountered and benefited from during our own learning journey. May they prove useful to you as you progress your way through yours!

-


-
-
-

Christopher Hall - Flow Cytometry Data Analysis in R

-

Cytometry-R-Scripts: R scripts to help with your flow cytometry analysis

-

R_flowcytometry_course: The files and presentation from the Cytometry Core Facility flow cytometry data analysis course in R

-
-

Installation and Loading Data

-

(1) Flow Cytometry Data Analysis in R - Installation and Loading Data

- -
-
-

Compensation, Cleaning, Transformation, Visualization

-

(2) Flow Cytometry Data Analysis in R: compensation, cleaning, transformation, visualization

- -
-
-

Gating with flowWorkspace

-

(3) Flow Cytometry Data Analysis in R: gating with flowWorkspace

- -
-
-

Visualization

-

(4) Flow Cytometry Data Analysis in R: Visualisation

- -


-
-
-
-
-

Ozette Technologies - BioC 2023 Workshop

-

Workshop given at the Bioc2023 conference, authored by Arpan Neupane and Andrew McDavid.

-

Workshop: Reproducible and programmatic analysis of flow cytometry experiments with the cytoverse

- -


-
-
-
-

Pritam Kumar Panda - Flow Cytometry Data Analysis & Visualization in R using CytoExploreR

-

Flow-Cytometry-analysis-in-R

-

CytoExploreR-Interactive-visualization

-
-

Complete Guide

-

Flow Cytometry Data Analysis & Visualization in R using CytoExploreR: Complete Guide

- -


-
-
-
-
-

Bioinformatics DotCa - Introduction to Flow Cytometry in R

-
-

Introduction to Flow Cytometry in R

-

Introduction to Flow Cytometry in R

- -
-
-

Exploring FCM Data in R

-

Exploring FCM Data in R

- -
-
-

Processing and Quality Assurance of FCM Data

-

Processing and Quality Assurance of FCM Data

- -
-
-

1D Dynamic Gating

-

1D Dynamic Gating

- -
-
-

Clustering and Additional FCM Tools

-

Clustering and Additional FCM Tools

- -
-
-
-

Tulika Rai - Learn Innovatively With Me

-
-

flowAI Flow Cytometry Data Cleaning using R

-

flowAI Flow Cytometry Data Cleaning using R: A Step-by-step Tutorial

- -
-
-

tSNE UMAP TRIMAP colorization or Transformation using R script

-

tSNE UMAP TRIMAP colorization or Transformation using R script

- -


-
-
-
-
-

Givanna Putri - Introduction to Cytometry Data Analysis in R workshop

-

ACS 2021 Workshops - Introduction to Cytometry Data Analysis in R workshop

- -


-
-
-
-

Timothy Keyes -

-

{tidytof}: Predicting Patient Outcomes from Single-cell Data using Tidy Data Principles

- -


-
-
-
-

Ryan Duggan - Cytometry on Air

-

Cytometry on Air: Analyzing Flow Cytometry Data in R Presentation by TJ Chen and Greg Finak,

- -


-
-
-
-

Guillaume Beyrend - Learn Cytometry

-

Learn Cytometry Originally appeared to have been paywalled, doesn’t currently appear to be the case.

-


-
-
-
-

Hong Qin - flow analysis in R

-
-

Flow Analysis in R

-

flow analysis in R, bio125, Spring 2015

- -
-
-

Flow Cytometer Data Analysis

-

BIO233 demo, flow cytometer data analysis, simple example

- -


-
-
-
-
-

Swayam Prabha - Flow cytometry data analysis in R/Bioconductor

-

Lecture 15 : Flow cytometry data analysis in R/Bioconductor

- -


-
-
-

AGPL-3.0 CC BY-SA 4.0

-
- - -
- -
- -
-
- -
- - - - + + + + + + + + + +Existing Resources – Cytometry in R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + +
+ +
+
+

Existing Resources

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

+
+

AGPL-3.0 CC BY-SA 4.0

+
+

We are not the first “Cytometry in R” course, nor will we be the last. This page is linking to the already existant online Cytometry in R resources that we have encountered and benefited from during our own learning journey. May they prove useful to you as you progress your way through yours!

+


+
+
+

Christopher Hall - Flow Cytometry Data Analysis in R

+

Cytometry-R-Scripts: R scripts to help with your flow cytometry analysis

+

R_flowcytometry_course: The files and presentation from the Cytometry Core Facility flow cytometry data analysis course in R

+
+

Installation and Loading Data

+

(1) Flow Cytometry Data Analysis in R - Installation and Loading Data

+ +
+
+

Compensation, Cleaning, Transformation, Visualization

+

(2) Flow Cytometry Data Analysis in R: compensation, cleaning, transformation, visualization

+ +
+
+

Gating with flowWorkspace

+

(3) Flow Cytometry Data Analysis in R: gating with flowWorkspace

+ +
+
+

Visualization

+

(4) Flow Cytometry Data Analysis in R: Visualisation

+ +


+
+
+
+
+

Ozette Technologies - BioC 2023 Workshop

+

Workshop given at the Bioc2023 conference, authored by Arpan Neupane and Andrew McDavid.

+

Workshop: Reproducible and programmatic analysis of flow cytometry experiments with the cytoverse

+ +


+
+
+
+

Pritam Kumar Panda - Flow Cytometry Data Analysis & Visualization in R using CytoExploreR

+

Flow-Cytometry-analysis-in-R

+

CytoExploreR-Interactive-visualization

+
+

Complete Guide

+

Flow Cytometry Data Analysis & Visualization in R using CytoExploreR: Complete Guide

+ +


+
+
+
+
+

Bioinformatics DotCa - Introduction to Flow Cytometry in R

+
+

Introduction to Flow Cytometry in R

+

Introduction to Flow Cytometry in R

+ +
+
+

Exploring FCM Data in R

+

Exploring FCM Data in R

+ +
+
+

Processing and Quality Assurance of FCM Data

+

Processing and Quality Assurance of FCM Data

+ +
+
+

1D Dynamic Gating

+

1D Dynamic Gating

+ +
+
+

Clustering and Additional FCM Tools

+

Clustering and Additional FCM Tools

+ +
+
+
+

Tulika Rai - Learn Innovatively With Me

+
+

flowAI Flow Cytometry Data Cleaning using R

+

flowAI Flow Cytometry Data Cleaning using R: A Step-by-step Tutorial

+ +
+
+

tSNE UMAP TRIMAP colorization or Transformation using R script

+

tSNE UMAP TRIMAP colorization or Transformation using R script

+ +


+
+
+
+
+

Givanna Putri - Introduction to Cytometry Data Analysis in R workshop

+

ACS 2021 Workshops - Introduction to Cytometry Data Analysis in R workshop

+ +


+
+
+
+

Timothy Keyes -

+

{tidytof}: Predicting Patient Outcomes from Single-cell Data using Tidy Data Principles

+ +


+
+
+
+

Ryan Duggan - Cytometry on Air

+

Cytometry on Air: Analyzing Flow Cytometry Data in R Presentation by TJ Chen and Greg Finak,

+ +


+
+
+
+

Guillaume Beyrend - Learn Cytometry

+

Learn Cytometry Originally appeared to have been paywalled, doesn’t currently appear to be the case.

+


+
+
+
+

Hong Qin - flow analysis in R

+
+

Flow Analysis in R

+

flow analysis in R, bio125, Spring 2015

+ +
+
+

Flow Cytometer Data Analysis

+

BIO233 demo, flow cytometer data analysis, simple example

+ +


+
+
+
+
+

Swayam Prabha - Flow cytometry data analysis in R/Bioconductor

+

Lecture 15 : Flow cytometry data analysis in R/Bioconductor

+ +


+
+
+

AGPL-3.0 CC BY-SA 4.0

+
+ + +
+ +
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/docs/PackageWalkthroughs.html b/docs/PackageWalkthroughs.html index 211cf96..810c7af 100644 --- a/docs/PackageWalkthroughs.html +++ b/docs/PackageWalkthroughs.html @@ -1,905 +1,905 @@ - - - - - - - - - -Package Walkthroughs – Cytometry in R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - - - -
- -
-
-

Package Walkthroughs

-
- - - -
- - - - -
- - - -
- - -

-
-

AGPL-3.0 CC BY-SA 4.0

-
-
-

Background

-

The purpose of this page is to host the Vignette writing challenge entries. There are a substantial number of R packages on both Bioconductor and GitHub that we will not be able to get to during the course. My goal for the off-weeks is to have the class assist in navigating through the existing vignettes/articles for each package, and write up a basic .qmd file to help anyone trying to use these packages have a simpler learning curve in doing so than they would have otherwise.

-
-
-

Bioconductor

-
-

flowCore

-
-
-

cytolib

-
-
-

flowWorkspace

-
-
-

ncdfFlow

-
-
-

flowViz

-
-
-

FlowSOM

-
-
-

ggcyto

-
-
-

openCyto

-
-
-

quantiseqr

-
-
-

flowStats

-
-
-

CytoML

-
-
-

CATALYST

-
-
-

flowAI

-
-
-

diffcyt

-
-
-

flowDensity

-
-
-

flowMeans

-
-
-

PeacoQC

-
-
-

flowFP

-
-
-

flowClean

-
-
-

flowPeaks

-
-
-

COMPASS

-
-
-

SamSPECTRAL

-
-
-

flowVS

-
-
-

cydar

-
-
-

flowMerge

-
-
-

flowTrans

-
-
-

distinct

-
-
-

flowCut

-
-
-

flowMatch

-
-
-

flowBeads

-
-
-

flowTime

-
-
-

sccomp

-
-
-

flowCHIC

-
-
-

flowSpecs

-
-
-

DepecheR

-
-
-

treekoR

-
-
-

flowBin

-
-
-

MetaCyto

-
-
-

immunoClust

-
-
-

scDataviz

-
-
-

cytoMEM

-
-
-

flowPloidy

-
-
-

plotGrouper

-
-
-

CytoDx

-
-
-

Sconify

-
-
-

flowPlots

-
-
-

GateFinder

-
-
-

flowGate

-
-
-

flowGraph

-
-
-

infinityFlow

-
-
-

cyanoFilter

-
-
-

optimalFlow

-
-
-

CytoGLMM

-
-
-

scifer

-
-
-

cytoKernel

-
-
-

CytoPipeline

-
-
-

censcyt

-
-
-

flowCyBar

-
-
-

reconsi

-
-
-

MACSQuantifyR

-
-
-

CytoMDS

-
-
-

CytoPipelineGUI

-
-
-

MAPFX

-
-
-

spillR

-
-
-

tidyFlowCore

-
-
-

CyTOFpower

-
-
-

tidytof

-
-
-

SuperCellCyto

-
-
-
-

GitHub

-
-

autospill

-
-
-

autospectral

-
-
-

flowMagic

-
-

AGPL-3.0 CC BY-SA 4.0

-
- - -
-
- -
- -
-
- -
- - - - + + + + + + + + + +Package Walkthroughs – Cytometry in R + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + +
+ +
+
+

Package Walkthroughs

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

+
+

AGPL-3.0 CC BY-SA 4.0

+
+
+

Background

+

The purpose of this page is to host the Vignette writing challenge entries. There are a substantial number of R packages on both Bioconductor and GitHub that we will not be able to get to during the course. My goal for the off-weeks is to have the class assist in navigating through the existing vignettes/articles for each package, and write up a basic .qmd file to help anyone trying to use these packages have a simpler learning curve in doing so than they would have otherwise.

+
+
+

Bioconductor

+
+

flowCore

+
+
+

cytolib

+
+
+

flowWorkspace

+
+
+

ncdfFlow

+
+
+

flowViz

+
+
+

FlowSOM

+
+
+

ggcyto

+
+
+

openCyto

+
+
+

quantiseqr

+
+
+

flowStats

+
+
+

CytoML

+
+
+

CATALYST

+
+
+

flowAI

+
+
+

diffcyt

+
+
+

flowDensity

+
+
+

flowMeans

+
+
+

PeacoQC

+
+
+

flowFP

+
+
+

flowClean

+
+
+

flowPeaks

+
+
+

COMPASS

+
+
+

SamSPECTRAL

+
+
+

flowVS

+
+
+

cydar

+
+
+

flowMerge

+
+
+

flowTrans

+
+
+

distinct

+
+
+

flowCut

+
+
+

flowMatch

+
+
+

flowBeads

+
+
+

flowTime

+
+
+

sccomp

+
+
+

flowCHIC

+
+
+

flowSpecs

+
+
+

DepecheR

+
+
+

treekoR

+
+
+

flowBin

+
+
+

MetaCyto

+
+
+

immunoClust

+
+
+

scDataviz

+
+
+

cytoMEM

+
+
+

flowPloidy

+
+
+

plotGrouper

+
+
+

CytoDx

+
+
+

Sconify

+
+
+

flowPlots

+
+
+

GateFinder

+
+
+

flowGate

+
+
+

flowGraph

+
+
+

infinityFlow

+
+
+

cyanoFilter

+
+
+

optimalFlow

+
+
+

CytoGLMM

+
+
+

scifer

+
+
+

cytoKernel

+
+
+

CytoPipeline

+
+
+

censcyt

+
+
+

flowCyBar

+
+
+

reconsi

+
+
+

MACSQuantifyR

+
+
+

CytoMDS

+
+
+

CytoPipelineGUI

+
+
+

MAPFX

+
+
+

spillR

+
+
+

tidyFlowCore

+
+
+

CyTOFpower

+
+
+

tidytof

+
+
+

SuperCellCyto

+
+
+
+

GitHub

+
+

autospill

+
+
+

autospectral

+
+
+

flowMagic

+
+

AGPL-3.0 CC BY-SA 4.0

+
+ + +
+
+ +
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/docs/course/00_BonusContent/Immport/images/index.html b/docs/course/00_BonusContent/Immport/images/index.html index 748afa5..0801bc5 100644 --- a/docs/course/00_BonusContent/Immport/images/index.html +++ b/docs/course/00_BonusContent/Immport/images/index.html @@ -212,7 +212,7 @@