Last updated: 2025-05-23

Checks: 7 0

Knit directory: DigitalResearchSkillsNetwork/

This reproducible R Markdown analysis was created with workflowr (version 1.7.1). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(1337) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version 15d20dd. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    .Rhistory
    Ignored:    analysis/.DS_Store
    Ignored:    analysis/.RData
    Ignored:    analysis/.Rhistory
    Ignored:    analysis/adit/.DS_Store
    Ignored:    plots/
    Ignored:    raw/

Untracked files:
    Untracked:  analysis/x202504_InFocus.Rmd
    Untracked:  analysis/x202504_Seminar.Rmd
    Untracked:  analysis/x202504_Workshop.Rmd
    Untracked:  analysis/x202505_InFocus.Rmd
    Untracked:  analysis/x202505_Seminar.Rmd
    Untracked:  analysis/x202505_Workshop.Rmd

Unstaged changes:
    Deleted:    analysis/202504_InFocus.Rmd
    Deleted:    analysis/202504_Seminar.Rmd
    Deleted:    analysis/202504_Workshop.Rmd
    Deleted:    analysis/202505_InFocus.Rmd
    Deleted:    analysis/202505_Seminar.Rmd
    Deleted:    analysis/202505_Workshop.Rmd
    Deleted:    analysis/adit/0_content management.csv
    Modified:   workflow.R

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/0_start.Rmd) and HTML (docs/0_start.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
html e794405 DrThomasOneil 2025-05-15 Build site.
html fb553e5 DrThomasOneil 2025-05-14 Build site.
html cff7923 DrThomasOneil 2025-05-07 Build site.
html 16a9613 DrThomasOneil 2025-04-30 Build site.
html 862d6b6 DrThomasOneil 2025-04-29 Build site.
html 938818e DrThomasOneil 2025-04-14 Build site.
Rmd 5628c6d DrThomasOneil 2025-04-14 wflow_publish("analysis/*.Rmd")
html ed690e6 DrThomasOneil 2025-04-14 Build site.
html cb886ef DrThomasOneil 2025-04-10 Build site.
html f6c0433 YuchenLi 2025-04-09 Build site.
html 8d78b0f YuchenLi 2025-04-09 Build site.
html 7421f69 DrThomasOneil 2025-04-08 Build site.
html f2d3385 DrThomasOneil 2025-03-24 update
html 517dcf9 DrThomasOneil 2025-03-24 Build site.
html 6a4432b DrThomasOneil 2025-03-24 Build site.
html 1f218f3 DrThomasOneil 2025-03-24 Build site.
html dca90e9 DrThomasOneil 2025-03-24 Build site.
html 1d1c076 DrThomasOneil 2025-03-24 Build site.
html 956ba9b DrThomasOneil 2025-03-24 Build site.
Rmd 6b72e34 DrThomasOneil 2025-03-24 wflow_publish(c("analysis/*.Rmd"))
html d600337 DrThomasOneil 2025-03-18 Build site.
html b537f69 DrThomasOneil 2025-03-18 Build site.
html b7982e9 DrThomasOneil 2025-03-16 Build site.
html fc5dd81 DrThomasOneil 2025-03-16 Build site.
html 8e1c1a3 DrThomasOneil 2025-03-16 Build site.
html 36dc5fc DrThomasOneil 2025-03-03 Build site.
html 49bb28c DrThomasOneil 2025-03-03 Build site.
html 8258922 DrThomasOneil 2025-03-03 Build site.
html 71646a5 DrThomasOneil 2025-02-27 Build site.
html c7f5738 DrThomasOneil 2025-02-24 Build site.
Rmd 41492b9 DrThomasOneil 2025-02-24 wflow_publish(c("analysis/*.Rmd"))
html 79d09b1 DrThomasOneil 2025-02-24 Build site.
html a5c9f2c DrThomasOneil 2025-02-24 Build site.
html ca2c086 DrThomasOneil 2025-02-24 Build site.
html fca0503 DrThomasOneil 2025-02-24 Build site.
html af42fba DrThomasOneil 2025-02-24 Build site.
html 1aeefc7 DrThomasOneil 2025-02-20 Build site.
html 5fe30de DrThomasOneil 2025-02-20 Build site.
html 5ef4f12 DrThomasOneil 2025-02-11 Build site.
html f48f4f0 DrThomasOneil 2025-02-10 Build site.
html 3bfe847 DrThomasOneil 2025-02-10 Build site.
html b14f3b5 DrThomasOneil 2025-02-10 Build site.
html bfba3e0 DrThomasOneil 2025-02-07 Build site.
Rmd b7989a4 DrThomasOneil 2025-02-07 wflow_publish(c("analysis/*.Rmd"))
html f3d6f87 DrThomasOneil 2025-02-04 Build site.
html f654b8d DrThomasOneil 2025-02-04 Build site.
Rmd e6ea78d DrThomasOneil 2025-02-04 wflow_publish(c("analysis/*.Rmd"))
html 4968925 DrThomasOneil 2025-01-30 Build site.
html 299ff3d DrThomasOneil 2025-01-28 Build site.
Rmd 272b312 DrThomasOneil 2025-01-28 wflow_publish(c("analysis/*"))
html 023005d DrThomasOneil 2025-01-07 Build site.
Rmd 0ecb65d DrThomasOneil 2025-01-07 Updated Getting Started in R. Chapter 1 completed
html c893d70 DrThomasOneil 2025-01-06 Build site.
Rmd 8eec2ce DrThomasOneil 2025-01-06 Initial Deployment
html 660b0f8 DrThomasOneil 2025-01-06 Build site.
html 2e79a1d DrThomasOneil 2025-01-06 Build site.
Rmd 451a21f DrThomasOneil 2025-01-06 Initial Deployment
Rmd 2eeb8dc DrThomasOneil 2024-12-26 first draft

This 10-chapter workshop series is designed to introduce users to R programming with a focus on bioinformatics workflows and reproducibility. It emphasizes the mindset shift required to transition from manual tools like Excel to programmatic data analysis.

Estimated time: 1.5 hours

Start the Tutorial →

Introduction: Shifting mindsets to programming

Goals:
Introduce programming concepts and the mindset behind programmatic workflows.
  • Transition from manual tools (e.g. Excel & Prism) to programming-based workflows.
  • Understand the concept of handling data using code.
  • Learn to navigate directories and file paths programmatically.
  • Emphasize reproducibility and structured workflows.

Go to Chapter →

Chapter 1: Getting Started with R and RStudio

Goals:
Set up R and RStudio, and get familiar with the interface.
  • Understand what a programming language is.
  • Know the difference between R, RStudio and python.
  • Install R and RStudio.
  • Exploring the interface – Console, Environment, Scripts.
  • Installing and loading packages.
  • Start your first project.

Go to Chapter →

Chapter 2: Data Types and Structures

Goals:
Learn about data types and structures in R.
  • Basic data types: numeric, character, logical.
  • Data structures: vectors, matrices, data frames, lists.
  • Assessing and querying data types and structures.
  • Importing data (RDS, Excel, CSV files).

Go to Chapter →

Chapter 3: Basic Programming

Goals:
Understand programming logic for automating tasks.
  • Variables and assignments.
  • Conditional statements (if, else).
  • Loops (for, while).
  • Writing functions.

Go to Chapter →

Chapter 4: Data Manipulation with tidyverse

Goals:
Introduce tidyverse for filtering, mutating, summarizing and pivoting data.
  • Filtering rows (filter()), selecting columns (select()).
  • Adding new columns (mutate()).
  • Grouping and summarizing (group_by() + summarize()).
  • Pivot longer and Pivot wider

Go to Chapter →

Chapter 5: Visualization with ggplot2 – Part 1

Goals:
Create and customize visualizations using ggplot2.
  • Basics of ggplot2
  • Make a scatterplot, boxplot and column graph
  • Customise labels, themes, and colors.

Go to Chapter →

Chapter 6: Advanced Visualization with ggplot2 – Part 2

Goals:
Learn additional visualisation techniques.
  • Adjusting theme elements
  • Annotating the plots
  • facet_wrap() and grid_plot()
  • Savings plots

Go to Chapter →

Chapter 7: Statistical Analysis

Goals:
Apply simple statistic to the synthetic data.
  • Descriptive statistics: mean, median, mode.
  • Hypothesis testing (t-tests, ANOVA).
  • Correlation and regression.

Go to Chapter →

Chapter 8: Reproducible Reports with RMarkdown

Content coming soon!

Goals:
Build a dynamic and shareable report of your analysis.
  • Introduction to RMarkdown.
  • Combining text, code, and visuals.
  • Generate tables with knitr.
  • Editing the yaml for additional customisations.
  • Exporting to PDF and HTML.

Go to Chapter →

Conclusions

Go to Chapter →


sessionInfo()
R version 4.4.0 (2024-04-24)
Platform: aarch64-apple-darwin20
Running under: macOS Sonoma 14.3

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Australia/Brisbane
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] workflowr_1.7.1

loaded via a namespace (and not attached):
 [1] vctrs_0.6.5       httr_1.4.7        cli_3.6.4         knitr_1.50       
 [5] rlang_1.1.6       xfun_0.51         stringi_1.8.4     processx_3.8.6   
 [9] promises_1.3.2    jsonlite_1.9.1    glue_1.8.0        rprojroot_2.0.4  
[13] git2r_0.35.0      htmltools_0.5.8.1 httpuv_1.6.15     ps_1.9.0         
[17] sass_0.4.9        rmarkdown_2.29    jquerylib_0.1.4   tibble_3.2.1     
[21] evaluate_1.0.3    fastmap_1.2.0     yaml_2.3.10       lifecycle_1.0.4  
[25] whisker_0.4.1     stringr_1.5.1     compiler_4.4.0    fs_1.6.5         
[29] pkgconfig_2.0.3   Rcpp_1.0.14       rstudioapi_0.17.1 later_1.4.1      
[33] digest_0.6.37     R6_2.6.1          pillar_1.10.1     callr_3.7.6      
[37] magrittr_2.0.3    bslib_0.9.0       tools_4.4.0       cachem_1.1.0     
[41] getPass_0.2-4    
LS0tCnRpdGxlOiAiR2V0dGluZyBTdGFydGVkIGluIFIgKDIwMjUpIgphdXRob3I6ICJUaG9tYXMgUi4gTydOZWlsIgpvdXRwdXQ6CiAgd29ya2Zsb3dyOjp3Zmxvd19odG1sOgogICAgdG9jOiBubwotLS0KCmBgYHtodG1sLCBpbmNsdWRlPUZ9CjxzY3JpcHQ+CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKTsKICBjaGVja2JveGVzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7CiAgICBjaGVja2JveC5jaGVja2VkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oY2hlY2tib3guaWQpID09PSAndHJ1ZSc7CiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGNoZWNrYm94LmlkLCBjaGVja2JveC5jaGVja2VkKTsKICAgIH0pOwogIH0pOwp9KTsKPC9zY3JpcHQ+CmBgYAoKVGhpcyAxMC1jaGFwdGVyIHdvcmtzaG9wIHNlcmllcyBpcyBkZXNpZ25lZCB0byBpbnRyb2R1Y2UgdXNlcnMgdG8gUiBwcm9ncmFtbWluZyB3aXRoIGEgZm9jdXMgb24gYmlvaW5mb3JtYXRpY3Mgd29ya2Zsb3dzIGFuZCByZXByb2R1Y2liaWxpdHkuIEl0IGVtcGhhc2l6ZXMgdGhlIG1pbmRzZXQgc2hpZnQgcmVxdWlyZWQgdG8gdHJhbnNpdGlvbiBmcm9tIG1hbnVhbCB0b29scyBsaWtlIEV4Y2VsIHRvIHByb2dyYW1tYXRpYyBkYXRhIGFuYWx5c2lzLgoKPHJlYWQtdGltZT48aT4qKkVzdGltYXRlZCB0aW1lKio6IDEuNSBob3VyczwvaT48L3JlYWQtdGltZT4KCltTdGFydCB0aGUgVHV0b3JpYWwg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL0RpZ2l0YWwtUmVzZWFyY2gtU2tpbGxzLU5ldHdvcmsvci10dXRvcmlhbC9fYm9vay9pbmRleC5odG1sKQoKPHdpbXI+CiAKIyMgKipJbnRyb2R1Y3Rpb246IFNoaWZ0aW5nIG1pbmRzZXRzIHRvIHByb2dyYW1taW5nKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAKKipHb2FsczoqKiAgICAKSW50cm9kdWNlIHByb2dyYW1taW5nIGNvbmNlcHRzIGFuZCB0aGUgbWluZHNldCBiZWhpbmQgcHJvZ3JhbW1hdGljIHdvcmtmbG93cy4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBUcmFuc2l0aW9uIGZyb20gbWFudWFsIHRvb2xzIChlLmcuIEV4Y2VsICYgUHJpc20pIHRvIHByb2dyYW1taW5nLWJhc2VkIHdvcmtmbG93cy4gIAombmJzcDsmbmJzcDsmIzgyMjY7IFVuZGVyc3RhbmQgdGhlIGNvbmNlcHQgb2YgaGFuZGxpbmcgZGF0YSB1c2luZyBjb2RlLiAgCiZuYnNwOyZuYnNwOyYjODIyNjsgTGVhcm4gdG8gbmF2aWdhdGUgZGlyZWN0b3JpZXMgYW5kIGZpbGUgcGF0aHMgcHJvZ3JhbW1hdGljYWxseS4gIAombmJzcDsmbmJzcDsmIzgyMjY7IEVtcGhhc2l6ZSByZXByb2R1Y2liaWxpdHkgYW5kIHN0cnVjdHVyZWQgd29ya2Zsb3dzLiAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vRGlnaXRhbC1SZXNlYXJjaC1Ta2lsbHMtTmV0d29yay9yLXR1dG9yaWFsL19ib29rL2ludHJvZHVjdGlvbi5odG1sKQoKPHdpbXI+CgojIyAqKkNoYXB0ZXIgMTogR2V0dGluZyBTdGFydGVkIHdpdGggUiBhbmQgUlN0dWRpbyoqCgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gIAoqKkdvYWxzOioqICAKU2V0IHVwIFIgYW5kIFJTdHVkaW8sIGFuZCBnZXQgZmFtaWxpYXIgd2l0aCB0aGUgaW50ZXJmYWNlLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBVbmRlcnN0YW5kIHdoYXQgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSAqaXMqLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBLbm93IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gUiwgUlN0dWRpbyBhbmQgcHl0aG9uLiAgICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgSW5zdGFsbCBSIGFuZCBSU3R1ZGlvLiAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEV4cGxvcmluZyB0aGUgaW50ZXJmYWNlIOKAkyBDb25zb2xlLCBFbnZpcm9ubWVudCwgU2NyaXB0cy4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgSW5zdGFsbGluZyBhbmQgbG9hZGluZyBwYWNrYWdlcy4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgU3RhcnQgeW91ciBmaXJzdCBwcm9qZWN0LiAgIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9EaWdpdGFsLVJlc2VhcmNoLVNraWxscy1OZXR3b3JrL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci0xLWdldHRpbmctc3RhcnRlZC1pbi1yLWFuZC1yc3R1ZGlvLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciAyOiBEYXRhIFR5cGVzIGFuZCBTdHJ1Y3R1cmVzKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgCioqR29hbHM6KiogIApMZWFybiBhYm91dCBkYXRhIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzIGluIFIuICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgQmFzaWMgZGF0YSB0eXBlczogbnVtZXJpYywgY2hhcmFjdGVyLCBsb2dpY2FsLiAgICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IERhdGEgc3RydWN0dXJlczogdmVjdG9ycywgbWF0cmljZXMsIGRhdGEgZnJhbWVzLCBsaXN0cy4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBBc3Nlc3NpbmcgYW5kIHF1ZXJ5aW5nIGRhdGEgdHlwZXMgYW5kIHN0cnVjdHVyZXMuICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgSW1wb3J0aW5nIGRhdGEgKFJEUywgRXhjZWwsIENTViBmaWxlcykuICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vRGlnaXRhbC1SZXNlYXJjaC1Ta2lsbHMtTmV0d29yay9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItMi1kYXRhLXR5cGVzLWFuZC1zdHJ1Y3R1cmVzLmh0bWwpCgo8d2ltcj4KCiMjICoqQ2hhcHRlciAzOiBCYXNpYyBQcm9ncmFtbWluZyoqCgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gICAgICAKKipHb2FsczoqKiAgICAgClVuZGVyc3RhbmQgcHJvZ3JhbW1pbmcgbG9naWMgZm9yIGF1dG9tYXRpbmcgdGFza3MuICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgVmFyaWFibGVzIGFuZCBhc3NpZ25tZW50cy4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgQ29uZGl0aW9uYWwgc3RhdGVtZW50cyAoYGlmYCwgYGVsc2VgKS4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgTG9vcHMgKGBmb3JgLCBgd2hpbGVgKS4gICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBXcml0aW5nIGZ1bmN0aW9ucy4gICAgCjwvZGl2PgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL0RpZ2l0YWwtUmVzZWFyY2gtU2tpbGxzLU5ldHdvcmsvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTMtYmFzaWMtcHJvZ3JhbW1pbmcuaHRtbCkKCjx3aW1yPgoKIyMjICoqQ2hhcHRlciA0OiBEYXRhIE1hbmlwdWxhdGlvbiB3aXRoIGB0aWR5dmVyc2VgKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAgIAoqKkdvYWxzOioqICAgICAKSW50cm9kdWNlIGB0aWR5dmVyc2VgIGZvciBmaWx0ZXJpbmcsIG11dGF0aW5nLCBzdW1tYXJpemluZyBhbmQgcGl2b3RpbmcgZGF0YS4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgRmlsdGVyaW5nIHJvd3MgKGBmaWx0ZXIoKWApLCBzZWxlY3RpbmcgY29sdW1ucyAoYHNlbGVjdCgpYCkuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEFkZGluZyBuZXcgY29sdW1ucyAoYG11dGF0ZSgpYCkuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEdyb3VwaW5nIGFuZCBzdW1tYXJpemluZyAoYGdyb3VwX2J5KClgICsgYHN1bW1hcml6ZSgpYCkuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IFBpdm90IGxvbmdlciBhbmQgUGl2b3Qgd2lkZXIgICAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vRGlnaXRhbC1SZXNlYXJjaC1Ta2lsbHMtTmV0d29yay9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItNC1kYXRhLW1hbmlwdWxhdGlvbi13aXRoLXRpZHl2ZXJzZS5odG1sKQoKPHdpbXI+CgojIyMgKipDaGFwdGVyIDU6IFZpc3VhbGl6YXRpb24gd2l0aCBgZ2dwbG90MmAg4oCTIFBhcnQgMSoqCgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gICAgICAKKipHb2FsczoqKiAgICAgCkNyZWF0ZSBhbmQgY3VzdG9taXplIHZpc3VhbGl6YXRpb25zIHVzaW5nIGBnZ3Bsb3QyYC4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgQmFzaWNzIG9mIGBnZ3Bsb3QyYCAgIAombmJzcDsmbmJzcDsmIzgyMjY7IE1ha2UgYSBzY2F0dGVycGxvdCwgYm94cGxvdCBhbmQgY29sdW1uIGdyYXBoICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEN1c3RvbWlzZSBsYWJlbHMsIHRoZW1lcywgYW5kIGNvbG9ycy4gICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vRGlnaXRhbC1SZXNlYXJjaC1Ta2lsbHMtTmV0d29yay9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItNS1kYXRhLXZpc3VhbGlzYXRpb24td2l0aC1nZ3Bsb3QyLmh0bWwpCgo8d2ltcj4KCiMjIyAqKkNoYXB0ZXIgNjogQWR2YW5jZWQgVmlzdWFsaXphdGlvbiB3aXRoIGBnZ3Bsb3QyYCDigJMgUGFydCAyKioKCjxkaXYgY2xhc3M9ImhpbnQtZ29hbHMiPiAgICAgIAoqKkdvYWxzOioqICAgICAKTGVhcm4gYWRkaXRpb25hbCB2aXN1YWxpc2F0aW9uIHRlY2huaXF1ZXMuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEFkanVzdGluZyB0aGVtZSBlbGVtZW50cyAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBBbm5vdGF0aW5nIHRoZSBwbG90cyAgICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgZmFjZXRfd3JhcCgpIGFuZCBncmlkX3Bsb3QoKSAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBTYXZpbmdzIHBsb3RzICAgCjwvZGl2PgoKW0dvIHRvIENoYXB0ZXIg4oaSXShodHRwczovL2RydGhvbWFzb25laWwuZ2l0aHViLmlvL0RpZ2l0YWwtUmVzZWFyY2gtU2tpbGxzLU5ldHdvcmsvci10dXRvcmlhbC9fYm9vay9jaGFwdGVyLTYtZGF0YS12aXN1YWxpc2F0aW9uLXdpdGgtZ2dwbG90Ml8yLmh0bWwpCgo8d2ltcj4KCiMjIyAqKkNoYXB0ZXIgNzogU3RhdGlzdGljYWwgQW5hbHlzaXMqKgoKPGRpdiBjbGFzcz0iaGludC1nb2FscyI+ICAgICAgCioqR29hbHM6KiogICAgIApBcHBseSBzaW1wbGUgc3RhdGlzdGljIHRvIHRoZSBzeW50aGV0aWMgZGF0YS4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgRGVzY3JpcHRpdmUgc3RhdGlzdGljczogbWVhbiwgbWVkaWFuLCBtb2RlLiAgICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgSHlwb3RoZXNpcyB0ZXN0aW5nICh0LXRlc3RzLCBBTk9WQSkuICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IENvcnJlbGF0aW9uIGFuZCByZWdyZXNzaW9uLiAgICAgICAKPC9kaXY+CgpbR28gdG8gQ2hhcHRlciDihpJdKGh0dHBzOi8vZHJ0aG9tYXNvbmVpbC5naXRodWIuaW8vRGlnaXRhbC1SZXNlYXJjaC1Ta2lsbHMtTmV0d29yay9yLXR1dG9yaWFsL19ib29rL2NoYXB0ZXItNy1zdGF0aXN0aWNhbC1hbmFseXNpcy5odG1sKQoKPHdpbXI+CgojIyMgKipDaGFwdGVyIDg6IFJlcHJvZHVjaWJsZSBSZXBvcnRzIHdpdGggUk1hcmtkb3duKioKCjxoaW50LXRleHQ+PHN0cm9uZz4qQ29udGVudCBjb21pbmcgc29vbiEqPC9zdHJvbmc+PC9oaW50LXRleHQ+Cgo8ZGl2IGNsYXNzPSJoaW50LWdvYWxzIj4gICAgICAKKipHb2FsczoqKiAgICAgCkJ1aWxkIGEgZHluYW1pYyBhbmQgc2hhcmVhYmxlIHJlcG9ydCBvZiB5b3VyIGFuYWx5c2lzLiAgICAKJm5ic3A7Jm5ic3A7JiM4MjI2OyBJbnRyb2R1Y3Rpb24gdG8gUk1hcmtkb3duLiAgIAombmJzcDsmbmJzcDsmIzgyMjY7IENvbWJpbmluZyB0ZXh0LCBjb2RlLCBhbmQgdmlzdWFscy4gICAgCiZuYnNwOyZuYnNwOyYjODIyNjsgR2VuZXJhdGUgdGFibGVzIHdpdGgga25pdHIuICAgICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEVkaXRpbmcgdGhlIHlhbWwgZm9yIGFkZGl0aW9uYWwgY3VzdG9taXNhdGlvbnMuICAgICAgIAombmJzcDsmbmJzcDsmIzgyMjY7IEV4cG9ydGluZyB0byBQREYgYW5kIEhUTUwuICAgIAo8L2Rpdj4KCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9EaWdpdGFsLVJlc2VhcmNoLVNraWxscy1OZXR3b3JrL3ItdHV0b3JpYWwvX2Jvb2svY2hhcHRlci04LXJlcHJvZHVjaWJsZS1yZXBvcnRzLXdpdGgtcm1hcmtkb3duLmh0bWwpCgo8d2ltcj4KCiMjIyAqKkNvbmNsdXNpb25zKioKCltHbyB0byBDaGFwdGVyIOKGkl0oaHR0cHM6Ly9kcnRob21hc29uZWlsLmdpdGh1Yi5pby9EaWdpdGFsLVJlc2VhcmNoLVNraWxscy1OZXR3b3JrL3ItdHV0b3JpYWwvX2Jvb2svY29uY2x1c2lvbnMuaHRtbCkKCgo8ZT4KCgo=