From d367bcc5e7be254c84d987a2388147eeda766bbd Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Fri, 13 Dec 2024 13:36:59 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- _redirects | 1 + index.html | 131 +- listings.json | 1 + posts/2023-06-27__hackathon_app/index.html | 2 +- .../valuelevel/derive_param_computed.html | 2 +- posts/2023-06-27_hackathon_writeup/index.html | 2 +- posts/2023-06-28_welcome/index.html | 2 +- posts/2023-07-09_cardinal/falcon.html | 2 +- .../blanks_and_nas.html | 2 +- .../code_sections.html | 2 +- .../cross_industry_dev.html | 2 +- posts/2023-07-24_rounding/rounding.html | 2 +- posts/2023-08-08_study_day/study_day.html | 2 +- .../rhino_submission_2.html | 2 +- .../date_functions_and_imputation.html | 2 +- .../pharmaverse_story.html | 2 +- .../floating_point.html | 10 +- .../2023-11-27_higher_order/higher_order.html | 2 +- posts/2023-12-18_admiral_1_0/admiral_1_0.html | 2 +- .../p_k__examples.html | 2 +- ...update_from_the__pharmaverse__council.html | 2 +- ...ontainers_and_webassembly_submissions.html | 2 +- .../2024-02-13_teal_on_cran/teal_on_cran.html | 2 +- .../iscr_conference.html | 2 +- .../admiral_filter_functions.html | 2 +- .../rhino_shiny_app_validation.html | 2 +- .../inside_the__pharmaverse.html | 2 +- .../tips_for__first__time__contributors.html | 2 +- .../2024-03-29_xportr_0_4_0/xportr_0_4_0.html | 2 +- posts/2024-04-08_tmc_cran/tmc_cran.html | 2 +- ...__r__programming_in__clinical__trials.html | 2 +- ...sanofi_joins_the_pharmaverse_council!.html | 2 +- .../tlg_catalog_webr.html | 2 +- ..._experience_as_new_admiral_developers.html | 2 +- ...diversity_&__inclusion_in_pharmaverse.html | 2 +- .../admiral_1.1_is_here.html | 2 +- ...sion_packages_admiralpeds_coming_soon.html | 2 +- ...ds_on_clinical_data_science_using__r..html | 2 +- .../unix_vs_sas_datetime.html | 6 +- .../working__groups__updates.html | 2 +- ...ssion_for__posit__shiny__contest_2024.html | 2 +- ...mpion_\342\200\223__laura__needleman.html" | 2 +- ..._ci_cd_action_for_the_pharmaverseblog.html | 2 +- .../university_undergraduate_report.html | 2 +- ...applications_in_roxygen_documentation.html | 2 +- ..._reproducibility_vs.__parallelization.html | 2 +- .../introducing_sdtm.oak.html | 2 +- ...ilt_a__lost__ec_g__data__script_in__r.html | 2 +- posts/2024-12-02_a_nca/a_nca.html | 2 +- .../document_your_universe_with_dverse.html | 900 ++ posts/2024-12-13_document_yo.../dverse.png | Bin 0 -> 165884 bytes search.json | 129 +- session_info.html | 8 +- .../crosstalk-1.2.1/css/crosstalk.min.css | 1 + site_libs/crosstalk-1.2.1/js/crosstalk.js | 1474 +++ site_libs/crosstalk-1.2.1/js/crosstalk.js.map | 37 + site_libs/crosstalk-1.2.1/js/crosstalk.min.js | 2 + .../crosstalk-1.2.1/js/crosstalk.min.js.map | 1 + site_libs/crosstalk-1.2.1/scss/crosstalk.scss | 75 + .../datatables-binding-0.33/datatables.js | 1539 +++ .../datatables-crosstalk.css | 32 + .../css/jquery.dataTables.extra.css | 28 + .../css/jquery.dataTables.min.css | 1 + .../js/jquery.dataTables.min.js | 4 + site_libs/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++ site_libs/jquery-3.6.0/jquery-3.6.0.min.js | 2 + site_libs/jquery-3.6.0/jquery-3.6.0.min.map | 1 + sitemap.xml | 108 +- 69 files changed, 15253 insertions(+), 209 deletions(-) create mode 100644 posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html create mode 100644 posts/2024-12-13_document_yo.../dverse.png create mode 100644 site_libs/crosstalk-1.2.1/css/crosstalk.min.css create mode 100644 site_libs/crosstalk-1.2.1/js/crosstalk.js create mode 100644 site_libs/crosstalk-1.2.1/js/crosstalk.js.map create mode 100644 site_libs/crosstalk-1.2.1/js/crosstalk.min.js create mode 100644 site_libs/crosstalk-1.2.1/js/crosstalk.min.js.map create mode 100644 site_libs/crosstalk-1.2.1/scss/crosstalk.scss create mode 100644 site_libs/datatables-binding-0.33/datatables.js create mode 100644 site_libs/datatables-css-0.0.0/datatables-crosstalk.css create mode 100644 site_libs/dt-core-1.13.6/css/jquery.dataTables.extra.css create mode 100644 site_libs/dt-core-1.13.6/css/jquery.dataTables.min.css create mode 100644 site_libs/dt-core-1.13.6/js/jquery.dataTables.min.js create mode 100644 site_libs/jquery-3.6.0/jquery-3.6.0.js create mode 100644 site_libs/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 site_libs/jquery-3.6.0/jquery-3.6.0.min.map diff --git a/.nojekyll b/.nojekyll index cdbdac75..9a0380ee 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -a6201e60 \ No newline at end of file +7384289c \ No newline at end of file diff --git a/_redirects b/_redirects index 4a117fd7..ab08d24f 100644 --- a/_redirects +++ b/_redirects @@ -46,6 +46,7 @@ /introducing... /posts/2024-10-24_introducing... /how__i__reb... /posts/2024-10-31_how__i__reb... /a_nca /posts/2024-12-02_a_nca +/document_yo... /posts/2024-12-13_document_yo... /category/shiny /#category=Shiny /category/community /#category=Community /category/adam /#category=ADaM diff --git a/index.html b/index.html index 626ff91e..bc4aba8b 100644 --- a/index.html +++ b/index.html @@ -223,7 +223,7 @@

Welcome to the pharmaverse blog!

Get notified of new posts by signing up to our periodic newsletter or by joining pharmaverse/slack. Be sure to check out https://www.r-bloggers.com as well.

-
Categories
All (48)
ADaM (18)
Community (23)
Conferences (3)
Metadata (2)
SDTM (3)
Shiny (9)
Submissions (5)
TLG (5)
Technical (14)
+
Categories
All (49)
ADaM (18)
Community (23)
Conferences (3)
Metadata (2)
SDTM (3)
Shiny (9)
Submissions (5)
TLG (5)
Technical (15)
@@ -262,7 +262,40 @@
Categories
-
+
+
+

+

+

+
+ + +
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+

diff --git a/listings.json b/listings.json index dc1e3a18..96499421 100644 --- a/listings.json +++ b/listings.json @@ -2,6 +2,7 @@ { "listing": "/index.html", "items": [ + "/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html", "/posts/2024-12-02_a_nca/a_nca.html", "/posts/2024-10-31_how__i__reb.../how__i__rebuilt_a__lost__ec_g__data__script_in__r.html", "/posts/2024-10-24_introducing.../introducing_sdtm.oak.html", diff --git a/posts/2023-06-27__hackathon_app/index.html b/posts/2023-06-27__hackathon_app/index.html index db3540da..0f8b9529 100644 --- a/posts/2023-06-27__hackathon_app/index.html +++ b/posts/2023-06-27__hackathon_app/index.html @@ -567,7 +567,7 @@

Conclusion

Last updated

-

2024-12-11 14:36:27.625388

+

2024-12-13 13:36:24.439421

Details

Source, Session info

diff --git a/posts/2023-06-27_admiral/valuelevel/derive_param_computed.html b/posts/2023-06-27_admiral/valuelevel/derive_param_computed.html index 82b8887b..44863316 100644 --- a/posts/2023-06-27_admiral/valuelevel/derive_param_computed.html +++ b/posts/2023-06-27_admiral/valuelevel/derive_param_computed.html @@ -366,7 +366,7 @@

Compare

Last updated

-

2024-12-11 14:36:30.041344

+

2024-12-13 13:36:26.827967

Details

Source, Session info

diff --git a/posts/2023-06-27_hackathon_writeup/index.html b/posts/2023-06-27_hackathon_writeup/index.html index fbcbf830..0cea2dba 100644 --- a/posts/2023-06-27_hackathon_writeup/index.html +++ b/posts/2023-06-27_hackathon_writeup/index.html @@ -287,7 +287,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:35.532408

+

2024-12-13 13:35:32.906097

Details

Source, Session info

diff --git a/posts/2023-06-28_welcome/index.html b/posts/2023-06-28_welcome/index.html index 0aa3bc34..9458b26f 100644 --- a/posts/2023-06-28_welcome/index.html +++ b/posts/2023-06-28_welcome/index.html @@ -273,7 +273,7 @@

How can I make

Last updated

-

2024-12-11 14:36:48.223611

+

2024-12-13 13:36:44.409016

Details

Source, Session info

diff --git a/posts/2023-07-09_cardinal/falcon.html b/posts/2023-07-09_cardinal/falcon.html index 2d56db07..e0e171ca 100644 --- a/posts/2023-07-09_cardinal/falcon.html +++ b/posts/2023-07-09_cardinal/falcon.html @@ -243,7 +243,7 @@

Next steps & vision<

Last updated

-

2024-12-11 14:36:31.726467

+

2024-12-13 13:36:28.4893

Details

Source, Session info

diff --git a/posts/2023-07-10_blanks_and_nas/blanks_and_nas.html b/posts/2023-07-10_blanks_and_nas/blanks_and_nas.html index 7028b73a..7f6f5660 100644 --- a/posts/2023-07-10_blanks_and_nas/blanks_and_nas.html +++ b/posts/2023-07-10_blanks_and_nas/blanks_and_nas.html @@ -344,7 +344,7 @@

That’s it!

Last updated

-

2024-12-11 14:36:17.495683

+

2024-12-13 13:36:14.401148

Details

Source, Session info

diff --git a/posts/2023-07-14_code_sections/code_sections.html b/posts/2023-07-14_code_sections/code_sections.html index 54d71aa7..4e315ea4 100644 --- a/posts/2023-07-14_code_sections/code_sections.html +++ b/posts/2023-07-14_code_sections/code_sections.html @@ -342,7 +342,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:52.443202

+

2024-12-13 13:35:49.706479

Details

Source, Session info

diff --git a/posts/2023-07-20_cross_company_dev/cross_industry_dev.html b/posts/2023-07-20_cross_company_dev/cross_industry_dev.html index 0f158133..9a5c3676 100644 --- a/posts/2023-07-20_cross_company_dev/cross_industry_dev.html +++ b/posts/2023-07-20_cross_company_dev/cross_industry_dev.html @@ -309,7 +309,7 @@

Impact

Last updated

-

2024-12-11 14:35:57.128027

+

2024-12-13 13:35:54.363381

Details

Source, Session info

diff --git a/posts/2023-07-24_rounding/rounding.html b/posts/2023-07-24_rounding/rounding.html index 4cb431c0..10957eea 100644 --- a/posts/2023-07-24_rounding/rounding.html +++ b/posts/2023-07-24_rounding/rounding.html @@ -513,7 +513,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:16.013389

+

2024-12-13 13:35:13.878078

Details

Source, Session info

diff --git a/posts/2023-08-08_study_day/study_day.html b/posts/2023-08-08_study_day/study_day.html index aa4f85ea..c6867bdd 100644 --- a/posts/2023-08-08_study_day/study_day.html +++ b/posts/2023-08-08_study_day/study_day.html @@ -305,7 +305,7 @@

It’s all relative? - Calculating Relative Days using admiral

Last updated

-

2024-12-11 14:35:32.036897

+

2024-12-13 13:35:29.731876

Details

Source, Session info

diff --git a/posts/2023-08-14_rhino_submission_2/rhino_submission_2.html b/posts/2023-08-14_rhino_submission_2/rhino_submission_2.html index 4a1098a9..aff40c0a 100644 --- a/posts/2023-08-14_rhino_submission_2/rhino_submission_2.html +++ b/posts/2023-08-14_rhino_submission_2/rhino_submission_2.html @@ -411,7 +411,7 @@

References

Last updated

-

2024-12-11 14:36:53.027128

+

2024-12-13 13:36:49.188335

Details

Source, Session info

diff --git a/posts/2023-09-26_date_functions_and_imputation/date_functions_and_imputation.html b/posts/2023-09-26_date_functions_and_imputation/date_functions_and_imputation.html index cc0c911d..87f40ac5 100644 --- a/posts/2023-09-26_date_functions_and_imputation/date_functions_and_imputation.html +++ b/posts/2023-09-26_date_functions_and_imputation/date_functions_and_imputation.html @@ -839,7 +839,7 @@

Conclusion

Last updated

-

2024-12-11 14:36:11.465579

+

2024-12-13 13:36:08.216333

Details

Source, Session info

diff --git a/posts/2023-10-10_pharmaverse_story/pharmaverse_story.html b/posts/2023-10-10_pharmaverse_story/pharmaverse_story.html index 22db3d5f..ad177204 100644 --- a/posts/2023-10-10_pharmaverse_story/pharmaverse_story.html +++ b/posts/2023-10-10_pharmaverse_story/pharmaverse_story.html @@ -261,7 +261,7 @@

Release, g

Last updated

-

2024-12-11 14:36:36.528309

+

2024-12-13 13:36:33.189044

Details

Source, Session info

diff --git a/posts/2023-10-30_floating_point/floating_point.html b/posts/2023-10-30_floating_point/floating_point.html index 3055ebdc..ad60ec02 100644 --- a/posts/2023-10-30_floating_point/floating_point.html +++ b/posts/2023-10-30_floating_point/floating_point.html @@ -373,8 +373,8 @@

Issues arising

select(TERM, GRADE_CRITERIA_CODE) %>% reactable(defaultPageSize = 4, highlight = TRUE, bordered = TRUE, striped = TRUE, resizable = TRUE)
-
- +
+

As you can see, the data-frame contains the column GRADE_CRITERIA_CODE which contains comparisons of floating point values. And there was a discrepancy of what Gordon expected to see, and how R actually computed the comparison initially:

@@ -631,8 +631,8 @@

Potential solutions select(TERM, GRADE_CRITERIA_CODE) %>% reactable(defaultPageSize = 4, highlight = TRUE, bordered = TRUE, striped = TRUE, resizable = TRUE)

-
- +
+
@@ -674,7 +674,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:59.459698

+

2024-12-13 13:35:56.669312

Details

Source, Session info

diff --git a/posts/2023-11-27_higher_order/higher_order.html b/posts/2023-11-27_higher_order/higher_order.html index b57c3cd3..13617721 100644 --- a/posts/2023-11-27_higher_order/higher_order.html +++ b/posts/2023-11-27_higher_order/higher_order.html @@ -836,7 +836,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:21.73838

+

2024-12-13 13:35:19.609314

Details

Source, Session info

diff --git a/posts/2023-12-18_admiral_1_0/admiral_1_0.html b/posts/2023-12-18_admiral_1_0/admiral_1_0.html index 6b8b1e2b..03a0de4b 100644 --- a/posts/2023-12-18_admiral_1_0/admiral_1_0.html +++ b/posts/2023-12-18_admiral_1_0/admiral_1_0.html @@ -543,7 +543,7 @@

Way Back Machine

Last updated

-

2024-12-11 14:36:03.23982

+

2024-12-13 13:36:00.200932

Details

Source, Session info

diff --git a/posts/2023-12-20_p_k__examples/p_k__examples.html b/posts/2023-12-20_p_k__examples/p_k__examples.html index ec0398ff..208d147b 100644 --- a/posts/2023-12-20_p_k__examples/p_k__examples.html +++ b/posts/2023-12-20_p_k__examples/p_k__examples.html @@ -400,7 +400,7 @@

Derive Additio

Last updated

-

2024-12-11 14:35:28.335785

+

2024-12-13 13:35:26.055111

Details

Source, Session info

diff --git a/posts/2024-01-04_end_of__year__up.../end_of__year__update_from_the__pharmaverse__council.html b/posts/2024-01-04_end_of__year__up.../end_of__year__update_from_the__pharmaverse__council.html index dcc47218..9e8bd0a0 100644 --- a/posts/2024-01-04_end_of__year__up.../end_of__year__update_from_the__pharmaverse__council.html +++ b/posts/2024-01-04_end_of__year__up.../end_of__year__update_from_the__pharmaverse__council.html @@ -243,7 +243,7 @@

P.S.

Last updated

-

2024-12-11 14:36:24.07455

+

2024-12-13 13:36:20.920604

Details

Source, Session info

diff --git a/posts/2024-02-01_containers_webassembly_submission/containers_and_webassembly_submissions.html b/posts/2024-02-01_containers_webassembly_submission/containers_and_webassembly_submissions.html index 708cf29f..6092397a 100644 --- a/posts/2024-02-01_containers_webassembly_submission/containers_and_webassembly_submissions.html +++ b/posts/2024-02-01_containers_webassembly_submission/containers_and_webassembly_submissions.html @@ -480,7 +480,7 @@

Next Steps

Last updated

-

2024-12-11 14:35:50.478089

+

2024-12-13 13:35:47.760684

Details

Source, Session info

diff --git a/posts/2024-02-13_teal_on_cran/teal_on_cran.html b/posts/2024-02-13_teal_on_cran/teal_on_cran.html index 37938d1b..c7f2b981 100644 --- a/posts/2024-02-13_teal_on_cran/teal_on_cran.html +++ b/posts/2024-02-13_teal_on_cran/teal_on_cran.html @@ -278,7 +278,7 @@

teal is now available on CRAN 🎉

Last updated

-

2024-12-11 14:36:25.642241

+

2024-12-13 13:36:22.450521

Details

Source, Session info

diff --git a/posts/2024-02-14_iscr_conference/iscr_conference.html b/posts/2024-02-14_iscr_conference/iscr_conference.html index 8adc15a6..a829fc93 100644 --- a/posts/2024-02-14_iscr_conference/iscr_conference.html +++ b/posts/2024-02-14_iscr_conference/iscr_conference.html @@ -307,7 +307,7 @@

Gallery

Last updated

-

2024-12-11 14:36:33.265711

+

2024-12-13 13:36:30.011023

Details

Source, Session info

diff --git a/posts/2024-03-01_admiral_filter_functions/admiral_filter_functions.html b/posts/2024-03-01_admiral_filter_functions/admiral_filter_functions.html index 16978029..79f75863 100644 --- a/posts/2024-03-01_admiral_filter_functions/admiral_filter_functions.html +++ b/posts/2024-03-01_admiral_filter_functions/admiral_filter_functions.html @@ -494,7 +494,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:37.884711

+

2024-12-13 13:35:35.226591

Details

Source, Session info

diff --git a/posts/2024-03-01_rhino_shiny_app_validation/rhino_shiny_app_validation.html b/posts/2024-03-01_rhino_shiny_app_validation/rhino_shiny_app_validation.html index 1aeecaa9..da4c7512 100644 --- a/posts/2024-03-01_rhino_shiny_app_validation/rhino_shiny_app_validation.html +++ b/posts/2024-03-01_rhino_shiny_app_validation/rhino_shiny_app_validation.html @@ -329,7 +329,7 @@

References

Last updated

-

2024-12-11 14:36:42.854658

+

2024-12-13 13:36:39.141346

Details

Source, Session info

diff --git a/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.html b/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.html index 29f76419..100fcde1 100644 --- a/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.html +++ b/posts/2024-03-04_inside_the__phar.../inside_the__pharmaverse.html @@ -289,7 +289,7 @@

Thank you

Last updated

-

2024-12-11 14:35:41.291834

+

2024-12-13 13:35:38.659057

Details

Source, Session info

diff --git a/posts/2024-03-11_tips_for__first_.../tips_for__first__time__contributors.html b/posts/2024-03-11_tips_for__first_.../tips_for__first__time__contributors.html index f9999223..09143605 100644 --- a/posts/2024-03-11_tips_for__first_.../tips_for__first__time__contributors.html +++ b/posts/2024-03-11_tips_for__first_.../tips_for__first__time__contributors.html @@ -271,7 +271,7 @@

Step

Last updated

-

2024-12-11 14:35:23.77128

+

2024-12-13 13:35:21.539042

Details

Source, Session info

diff --git a/posts/2024-03-29_xportr_0_4_0/xportr_0_4_0.html b/posts/2024-03-29_xportr_0_4_0/xportr_0_4_0.html index 4875b504..05556b4e 100644 --- a/posts/2024-03-29_xportr_0_4_0/xportr_0_4_0.html +++ b/posts/2024-03-29_xportr_0_4_0/xportr_0_4_0.html @@ -391,7 +391,7 @@

Let’s Recap!

Last updated

-

2024-12-11 14:35:13.966711

+

2024-12-13 13:34:59.076611

Details

Source, Session info

diff --git a/posts/2024-04-08_tmc_cran/tmc_cran.html b/posts/2024-04-08_tmc_cran/tmc_cran.html index 3215c8ff..2bab97bf 100644 --- a/posts/2024-04-08_tmc_cran/tmc_cran.html +++ b/posts/2024-04-08_tmc_cran/tmc_cran.html @@ -255,7 +255,7 @@

Acknowledgments

Last updated

-

2024-12-11 14:36:49.762473

+

2024-12-13 13:36:45.904774

Details

Source, Session info

diff --git a/posts/2024-04-15_de-_mystifying__.../de-_mystifying__r__programming_in__clinical__trials.html b/posts/2024-04-15_de-_mystifying__.../de-_mystifying__r__programming_in__clinical__trials.html index eef6bae1..d3fb6185 100644 --- a/posts/2024-04-15_de-_mystifying__.../de-_mystifying__r__programming_in__clinical__trials.html +++ b/posts/2024-04-15_de-_mystifying__.../de-_mystifying__r__programming_in__clinical__trials.html @@ -275,7 +275,7 @@

Last updated

-

2024-12-11 14:36:51.311499

+

2024-12-13 13:36:47.491512

Details

Source, Session info

diff --git a/posts/2024-04-29_appsilon_and__sa.../appsilon_and__sanofi_joins_the_pharmaverse_council!.html b/posts/2024-04-29_appsilon_and__sa.../appsilon_and__sanofi_joins_the_pharmaverse_council!.html index e108a035..0898d42e 100644 --- a/posts/2024-04-29_appsilon_and__sa.../appsilon_and__sanofi_joins_the_pharmaverse_council!.html +++ b/posts/2024-04-29_appsilon_and__sa.../appsilon_and__sanofi_joins_the_pharmaverse_council!.html @@ -245,7 +245,7 @@

Sanofi and Open Source

Last updated

-

2024-12-11 14:36:20.592486

+

2024-12-13 13:36:17.46769

Details

Source, Session info

diff --git a/posts/2024-05-08_tlg_catalog_webr/tlg_catalog_webr.html b/posts/2024-05-08_tlg_catalog_webr/tlg_catalog_webr.html index f3db3430..e50c7ff3 100644 --- a/posts/2024-05-08_tlg_catalog_webr/tlg_catalog_webr.html +++ b/posts/2024-05-08_tlg_catalog_webr/tlg_catalog_webr.html @@ -271,7 +271,7 @@

Summary

Last updated

-

2024-12-11 14:35:25.382215

+

2024-12-13 13:35:23.118893

Details

Source, Session info

diff --git a/posts/2024-05-29_our_experience_a.../our_experience_as_new_admiral_developers.html b/posts/2024-05-29_our_experience_a.../our_experience_as_new_admiral_developers.html index d5318276..0a712440 100644 --- a/posts/2024-05-29_our_experience_a.../our_experience_as_new_admiral_developers.html +++ b/posts/2024-05-29_our_experience_a.../our_experience_as_new_admiral_developers.html @@ -269,7 +269,7 @@

What have we enjoyed

Last updated

-

2024-12-11 14:36:34.87595

+

2024-12-13 13:36:31.593308

Details

Source, Session info

diff --git a/posts/2024-05-31_diversity_&__inc.../diversity_&__inclusion_in_pharmaverse.html b/posts/2024-05-31_diversity_&__inc.../diversity_&__inclusion_in_pharmaverse.html index 32e1ff81..5a8f8717 100644 --- a/posts/2024-05-31_diversity_&__inc.../diversity_&__inclusion_in_pharmaverse.html +++ b/posts/2024-05-31_diversity_&__inc.../diversity_&__inclusion_in_pharmaverse.html @@ -222,7 +222,7 @@

Diversity & Inclusion in pharmaverse

Last updated

-

2024-12-11 14:35:53.975169

+

2024-12-13 13:35:51.244805

Details

source code, R environment

diff --git a/posts/2024-06-07_admiral_1.1_is.../admiral_1.1_is_here.html b/posts/2024-06-07_admiral_1.1_is.../admiral_1.1_is_here.html index 870f8068..71119c41 100644 --- a/posts/2024-06-07_admiral_1.1_is.../admiral_1.1_is_here.html +++ b/posts/2024-06-07_admiral_1.1_is.../admiral_1.1_is_here.html @@ -499,7 +499,7 @@

What’s next for admiral and the admiral family?

Last updated

-

2024-12-11 14:36:08.56101

+

2024-12-13 13:36:05.361709

Details

Source, Session info

diff --git a/posts/2024-06-17_new_admiral_ex.../new_admiral_extension_packages_admiralpeds_coming_soon.html b/posts/2024-06-17_new_admiral_ex.../new_admiral_extension_packages_admiralpeds_coming_soon.html index f97641ca..9defae69 100644 --- a/posts/2024-06-17_new_admiral_ex.../new_admiral_extension_packages_admiralpeds_coming_soon.html +++ b/posts/2024-06-17_new_admiral_ex.../new_admiral_extension_packages_admiralpeds_coming_soon.html @@ -263,7 +263,7 @@

What else?

Last updated

-

2024-12-11 14:35:39.754589

+

2024-12-13 13:35:37.10447

Details

Source, Session info

diff --git a/posts/2024-07-03_introducing_a_ne.../introducing_a_new_coursera_course_for_hands_on_clinical_data_science_using__r..html b/posts/2024-07-03_introducing_a_ne.../introducing_a_new_coursera_course_for_hands_on_clinical_data_science_using__r..html index bd0e2308..b7e2fcda 100644 --- a/posts/2024-07-03_introducing_a_ne.../introducing_a_new_coursera_course_for_hands_on_clinical_data_science_using__r..html +++ b/posts/2024-07-03_introducing_a_ne.../introducing_a_new_coursera_course_for_hands_on_clinical_data_science_using__r..html @@ -248,7 +248,7 @@

Introducing a

Last updated

-

2024-12-11 14:36:15.647686

+

2024-12-13 13:36:12.575423

Details

Source, Session info

diff --git a/posts/2024-07-08_unix_vs_sas_date.../unix_vs_sas_datetime.html b/posts/2024-07-08_unix_vs_sas_date.../unix_vs_sas_datetime.html index 42c34c0f..260ec91e 100644 --- a/posts/2024-07-08_unix_vs_sas_date.../unix_vs_sas_datetime.html +++ b/posts/2024-07-08_unix_vs_sas_date.../unix_vs_sas_datetime.html @@ -244,9 +244,9 @@

Consideratio

Dealing with Date Interoperability in Dataset-JSON

-

Dataset-JSON v1.1 could potentially be used in future data exchanges between SAS and R. Given the differing approaches to handling dates across programming languages, the challenge lies in managing dates within a programming language agnostic data exchange format.

+

Dataset-JSON v1.1 could potentially be used in future data exchanges between SAS and R. Given the differing approaches to handling dates across programming languages, the challenge lies in managing dates within a programming language agnostic data exchange format.

What is Dataset-JSON? Dataset-JSON is a dataset exchange standard that uses JSON. It is designed to meet regulatory submission requirements and other dataset exchange scenarios. It has the potential to replace XPT as the default format for clinical and device data submissions to regulatory authorities.

-

To address interoperability issues across programming languages, options include storing numeric dates as ISO 8601 strings with a targetdatatype attribute to differentiate between character and numeric dates, or associating the epoch with the numeric date values. Refer to the Dataset-JSON specification for the latest date handling specifications. These approaches ensure that conversion tools receive sufficient information to handle dates correctly.

+

To address interoperability issues across programming languages, options include storing numeric dates as ISO 8601 strings with a targetdatatype attribute to differentiate between character and numeric dates, or associating the epoch with the numeric date values. Refer to the Dataset-JSON specification for the latest date handling specifications. These approaches ensure that conversion tools receive sufficient information to handle dates correctly.

To ensure the correct handling of dates in Dataset-JSON, you can use the datasetjson R package, which is built to read and write CDISC Dataset JSON formatted datasets.

@@ -265,7 +265,7 @@

Conclusion

Last updated

-

2024-12-11 14:36:44.507606

+

2024-12-13 13:36:40.755842

Details

Source, Session info

diff --git a/posts/2024-07-24_working__groups_.../working__groups__updates.html b/posts/2024-07-24_working__groups_.../working__groups__updates.html index 4a84d994..acec203e 100644 --- a/posts/2024-07-24_working__groups_.../working__groups__updates.html +++ b/posts/2024-07-24_working__groups_.../working__groups__updates.html @@ -226,7 +226,7 @@

Working Groups Updates

Last updated

-

2024-12-11 14:35:55.491587

+

2024-12-13 13:35:52.735265

Details

Source, Session info

diff --git a/posts/2024-08-20_teal_submission_.../teal_submission_for__posit__shiny__contest_2024.html b/posts/2024-08-20_teal_submission_.../teal_submission_for__posit__shiny__contest_2024.html index 8d853321..4810504e 100644 --- a/posts/2024-08-20_teal_submission_.../teal_submission_for__posit__shiny__contest_2024.html +++ b/posts/2024-08-20_teal_submission_.../teal_submission_for__posit__shiny__contest_2024.html @@ -249,7 +249,7 @@

Last updated

-

2024-12-11 14:36:41.331158

+

2024-12-13 13:36:37.61853

Details

Source, Session info

diff --git "a/posts/2024-09-03_meet_our__divers.../meet_our__diversity__champion_\342\200\223__laura__needleman.html" "b/posts/2024-09-03_meet_our__divers.../meet_our__diversity__champion_\342\200\223__laura__needleman.html" index 914bd067..3f6d0850 100644 --- "a/posts/2024-09-03_meet_our__divers.../meet_our__diversity__champion_\342\200\223__laura__needleman.html" +++ "b/posts/2024-09-03_meet_our__divers.../meet_our__diversity__champion_\342\200\223__laura__needleman.html" @@ -229,7 +229,7 @@

Meet our Diversity Champion – Laura Needleman

Last updated

-

2024-12-11 14:35:30.084262

+

2024-12-13 13:35:27.781157

Details

Source, Session info

diff --git a/posts/2024-09-11_writing_my_first.../writing_my_first_custom_ci_cd_action_for_the_pharmaverseblog.html b/posts/2024-09-11_writing_my_first.../writing_my_first_custom_ci_cd_action_for_the_pharmaverseblog.html index 1c8e70f3..c6f0b607 100644 --- a/posts/2024-09-11_writing_my_first.../writing_my_first_custom_ci_cd_action_for_the_pharmaverseblog.html +++ b/posts/2024-09-11_writing_my_first.../writing_my_first_custom_ci_cd_action_for_the_pharmaverseblog.html @@ -431,7 +431,7 @@

Conclusion

Last updated

-

2024-12-11 14:36:22.222152

+

2024-12-13 13:36:19.087627

Details

Source, Session info

diff --git a/posts/2024-09-16_university_undergraduate_report/university_undergraduate_report.html b/posts/2024-09-16_university_undergraduate_report/university_undergraduate_report.html index cb520dd0..91da284c 100644 --- a/posts/2024-09-16_university_undergraduate_report/university_undergraduate_report.html +++ b/posts/2024-09-16_university_undergraduate_report/university_undergraduate_report.html @@ -290,7 +290,7 @@

Undergraduate University Statistics Report using pharmaversead

Last updated

-

2024-12-11 14:36:46.460963

+

2024-12-13 13:36:42.644805

Details

Source, Session info

diff --git a/posts/2024-10-11_roxy.shinyl.../roxy.shinylive_-_shinylive_applications_in_roxygen_documentation.html b/posts/2024-10-11_roxy.shinyl.../roxy.shinylive_-_shinylive_applications_in_roxygen_documentation.html index cc307e4b..cfdf26ec 100644 --- a/posts/2024-10-11_roxy.shinyl.../roxy.shinylive_-_shinylive_applications_in_roxygen_documentation.html +++ b/posts/2024-10-11_roxy.shinyl.../roxy.shinylive_-_shinylive_applications_in_roxygen_documentation.html @@ -281,7 +281,7 @@

roxy.shinylive - shinylive applications in roxygen documentati

Last updated

-

2024-12-11 14:35:44.321598

+

2024-12-13 13:35:41.695278

Details

Source, Session info

diff --git a/posts/2024-10-16_the__tensio.../the__tension_of__high-_performance__computing:__reproducibility_vs.__parallelization.html b/posts/2024-10-16_the__tensio.../the__tension_of__high-_performance__computing:__reproducibility_vs.__parallelization.html index 52ab62c5..fd159215 100644 --- a/posts/2024-10-16_the__tensio.../the__tension_of__high-_performance__computing:__reproducibility_vs.__parallelization.html +++ b/posts/2024-10-16_the__tensio.../the__tension_of__high-_performance__computing:__reproducibility_vs.__parallelization.html @@ -421,7 +421,7 @@

Closing Thoughts

Last updated

-

2024-12-11 14:35:48.600117

+

2024-12-13 13:35:45.906627

Details

Source, Session info

diff --git a/posts/2024-10-24_introducing.../introducing_sdtm.oak.html b/posts/2024-10-24_introducing.../introducing_sdtm.oak.html index 8c50c2d5..497bbe85 100644 --- a/posts/2024-10-24_introducing.../introducing_sdtm.oak.html +++ b/posts/2024-10-24_introducing.../introducing_sdtm.oak.html @@ -461,7 +461,7 @@

Get Involved

Last updated

-

2024-12-11 14:36:39.401892

+

2024-12-13 13:36:35.714607

Details

Source, Session info

diff --git a/posts/2024-10-31_how__i__reb.../how__i__rebuilt_a__lost__ec_g__data__script_in__r.html b/posts/2024-10-31_how__i__reb.../how__i__rebuilt_a__lost__ec_g__data__script_in__r.html index 91ef9f6d..4353c1b4 100644 --- a/posts/2024-10-31_how__i__reb.../how__i__rebuilt_a__lost__ec_g__data__script_in__r.html +++ b/posts/2024-10-31_how__i__reb.../how__i__rebuilt_a__lost__ec_g__data__script_in__r.html @@ -453,7 +453,7 @@

Conclusion

Last updated

-

2024-12-11 14:35:18.311618

+

2024-12-13 13:35:16.161302

Details

Source, Session info

diff --git a/posts/2024-12-02_a_nca/a_nca.html b/posts/2024-12-02_a_nca/a_nca.html index 32a688ee..ef6fdcaf 100644 --- a/posts/2024-12-02_a_nca/a_nca.html +++ b/posts/2024-12-02_a_nca/a_nca.html @@ -248,7 +248,7 @@

Get Started!<

Last updated

-

2024-12-11 14:35:46.061625

+

2024-12-13 13:35:43.395724

Details

Source, Session info

diff --git a/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html b/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html new file mode 100644 index 00000000..4821057d --- /dev/null +++ b/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html @@ -0,0 +1,900 @@ + + + + + + + + + + + + +Creating a better universe with dverse – pharmaverse blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Creating a better universe with dverse

+
+
+ How to create a global search across an entire collection of R packages: A use case for the toy ‘admiralverse’ +
+
+
+
Technical
+
+
+
+ + +
+ +
+
Author
+
+

Mauro Lepore

+
+
+ +
+
Published
+
+

December 13, 2024

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

This article shows how to create a global search for any collection of R packages, i.e. a universe. Your universe may be on CRAN, large, and popular like the tidyverse or pharmaverse. But it may also be not on CRAN, small, company-specific or personal.

+

The example here uses the ‘admiralverse’ – a toy universe defined as every package on CRAN today (2024-12-07), with a website, and a name starting with ‘admiral’.

+

You need:

+
    +
  • the package {dverse} to document your universe,
  • +
  • each package in the toy ‘admiralverse’ to access the documentation metadata,
  • +
  • {dplyr} to manipulate the output of {dverse} , and
  • +
  • {DT} to create a searchable table.
  • +
+
+
library(dverse)
+library(admiral)
+library(admiraldev)
+library(admiralonco)
+library(admiralophtha)
+library(admiralpeds)
+library(admiralvaccine)
+library(dplyr)
+library(DT)
+
+
+ +Versions + +
+
packageVersion("dverse")
+## [1] '0.2.0'
+packageVersion("admiral")
+## [1] '1.1.1'
+packageVersion("admiraldev")
+## [1] '1.1.0'
+packageVersion("admiralonco")
+## [1] '1.1.0'
+packageVersion("admiralophtha")
+## [1] '1.1.0'
+packageVersion("admiralpeds")
+## [1] '0.1.0'
+packageVersion("admiralvaccine")
+## [1] '0.3.0'
+packageVersion("dplyr")
+## [1] '1.1.4'
+packageVersion("DT")
+## [1] '0.33'
+
+
+

dverse::document_universe() takes the names of the packages in the ‘admiralverse’, and a template pointing to each help file (topic) in each package.

+
+
admiralverse <- c(
+  "admiral",
+  "admiraldev",
+  "admiralonco",
+  "admiralophtha",
+  "admiralpeds",
+  "admiralvaccine"
+)
+# For example: https://pharmaverse.github.io/admiral/reference/queries.html
+template <- "https://pharmaverse.github.io/{package}/reference/{topic}.html"
+
+docs <- dverse::document_universe(admiralverse, template)
+docs
+## # A tibble: 344 × 7
+##    topic                               alias title concept type  keyword package
+##    <chr>                               <chr> <chr> <chr>   <chr> <chr>   <chr>  
+##  1 <a href=https://pharmaverse.github… %>%   Pipe… reexpo… help  <NA>    admiral
+##  2 <a href=https://pharmaverse.github… %not… Nega… dev_ut… help  <NA>    admira…
+##  3 <a href=https://pharmaverse.github… %or%  Or    dev_ut… help  <NA>    admira…
+##  4 <a href=https://pharmaverse.github… adbc… Crea… <NA>    vign… <NA>    admira…
+##  5 <a href=https://pharmaverse.github… adce  Crea… <NA>    vign… <NA>    admira…
+##  6 <a href=https://pharmaverse.github… add_… Add … quo     help  <NA>    admira…
+##  7 <a href=https://pharmaverse.github… adfa… Crea… <NA>    vign… <NA>    admira…
+##  8 <a href=https://pharmaverse.github… adis  Crea… <NA>    vign… <NA>    admira…
+##  9 <a href=https://pharmaverse.github… admi… admi… intern… help  intern… admiral
+## 10 <a href=https://pharmaverse.github… admi… Lab … datase… help  datase… admiral
+## # ℹ 334 more rows
+
+

You may need to exclude some topics, such as reexported objects from other packages. Because topics outside your universe yield broken links, you can exclude them with dverse::is_online() .

+
+
docs |> filter(!dverse::is_online(topic))
+## # A tibble: 9 × 7
+##   topic                                alias title concept type  keyword package
+##   <chr>                                <chr> <chr> <chr>   <chr> <chr>   <chr>  
+## 1 <a href=https://pharmaverse.github.… %>%   Pipe… reexpo… help  <NA>    admiral
+## 2 <a href=https://pharmaverse.github.… %not… Nega… dev_ut… help  <NA>    admira…
+## 3 <a href=https://pharmaverse.github.… %or%  Or    dev_ut… help  <NA>    admira…
+## 4 <a href=https://pharmaverse.github.… anti… Join… joins   help  <NA>    admira…
+## 5 <a href=https://pharmaverse.github.… deat… Pre-… source… help  <NA>    admiral
+## 6 <a href=https://pharmaverse.github.… deat… Pre-… source… help  <NA>    admira…
+## 7 <a href=https://pharmaverse.github.… desc  dply… reexpo… help  <NA>    admiral
+## 8 <a href=https://pharmaverse.github.… exprs rlan… reexpo… help  <NA>    admiral
+## 9 <a href=https://pharmaverse.github.… rsp_… Pre-… source… help  <NA>    admira…
+
+online <- docs |> filter(dverse::is_online(topic))
+
+

Consider the different kinds of documentation in your universe.

+
+
online |> count(type, keyword)
+## # A tibble: 4 × 3
+##   type     keyword      n
+##   <chr>    <chr>    <int>
+## 1 help     datasets    26
+## 2 help     internal    27
+## 3 help     <NA>       243
+## 4 vignette <NA>        39
+
+

You may organize the documentation however you like. For inspiration see the pactaverse, the toy ‘admiralverse’, fgeo and tidymodels.

+

Here it makes sense to place vignettes, datasets, and public functions in separate tables.

+
+

Vignettes

+

Here are all the vignettes available across packages in the ‘admiralverse’. Click on each topic to read its corresponding vignette.

+
+
vignettes <- online |> filter(type == "vignette")
+
+vignettes |>
+  distinct(topic, title, package) |>
+  datatable(escape = FALSE)
+
+
+ +
+
+
+

You don’t see what you expect?

+ +
+
+
+

Datasets

+

Here are all the datasets. Click on each topic to read about it.

+
+
datasets <- online |> filter(keyword == "datasets")
+
+datasets |>
+  distinct(topic, title, package) |>
+  datatable(escape = FALSE)
+
+
+ +
+
+
+
+

Functions

+

Here are all the functions. Click on each topic to read about it.

+
+
internal <- online |> filter(keyword == "internal")
+
+public <- online |>
+  anti_join(vignettes) |>
+  anti_join(datasets) |>
+  anti_join(internal)
+
+public |>
+  distinct(topic, title, package) |>
+  datatable(escape = FALSE)
+
+
+ +
+
+
+
+

Learn More

+

To learn more see the toy ‘admiralverse’ meta-package – which models the main use case of {dverse} .

+

You may also enjoy these videos:

+
    +
  • Creating a meta-package for the toy ‘admiralverse’ (5’).
  • +
  • Creating a website for the toy ‘admiralverse’ (9’).
  • +
+

Was this useful? Do you want to report bugs, propose changes or request features?.

+

Let’s connect.

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

Last updated

+ +

2024-12-13 13:35:11.818454

+

Details

Reuse

Citation

BibTeX citation:
@online{lepore2024,
+  author = {Lepore, Mauro},
+  title = {Creating a Better Universe with Dverse},
+  date = {2024-12-13},
+  url = {https://pharmaverse.github.io/blog/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html},
+  langid = {en}
+}
+
For attribution, please cite this work as:
+Lepore, Mauro. 2024. “Creating a Better Universe with +Dverse.” December 13, 2024. https://pharmaverse.github.io/blog/posts/2024-12-13_document_yo.../document_your_universe_with_dverse.html. +
+ +
+ + + + + + \ No newline at end of file diff --git a/posts/2024-12-13_document_yo.../dverse.png b/posts/2024-12-13_document_yo.../dverse.png new file mode 100644 index 0000000000000000000000000000000000000000..3c54cf2b3aa473bb462bd5af026f74c796324305 GIT binary patch literal 165884 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
  • qpH=MvXsMhb(uMNrna`x@)fZ*nZL#@{%4T` zzG0IO3coXNUmpYKX*Jpl*N=Zv8-HD64vG2108#19-B+m9YVKyexXL|NpSSrd{1l7! z+Gyl)aSUjLJ{h5)=psa2Jl?O^%SPBWmGld?9y%=@;aetjOzZh)_|1`R9QDki5E2D0 z;|8rau03AC)Axk&E#2#Ootr}^R?rsoQcEhmoK5hNE2o-hvbR*{6Xd$5_ale3hS490OmRJ#G zzM0RHMhWM3g%upg`2ee)Dv2j!k3Kn}M(^PI^5pWd_4y3Lj73CV5t=c{MVysu%qSqn znzIM8QrWe4-1Vkhyj`1^nrvuk5-(93IP#>`W|)Y#f|C?~@~79=Cpg<{i5!{(^1lVP z{FxPW_zV2u4it3wA9V>`JH&CW-*kV?yhD^)A=fo@$TxyYK_?K9K*-LrSSrwqpobj9 z!6=#VPm&rmovz+B@K3BGT&`rHs6&0LcLGzjXR44QV#M6C&G#NZ>tgT_0X1%@&EuUv zx)Q{(3L71=aPGR*%h(x4ek>WA&Er_#(b3mFOj2f->3-@#KFfRWo6C_PIOf?oa8JO) z%j=h@kluRCX)BwhT&ucc^rgMKCtv zZ;lW1sE)45tH?YruV9=nB#H#*DvB zE+`2HndVF^BPL10u2Hb_rR~4m6D%W}Q*$WBmZ3=nn+?YUrD4oRcty)bMzDUV#%f=_ z?6#_TgV`<+FG{9WtI&u{C~;Pdk@<+pmrfLN=O;pJj3B+!#^VhY!e2CQZzcWDBJ=4T z;L&A0T0g>{&UhIP$WLLoyC9tqrvFu$>mEc$$)fRLh;t~u5Utr0|A=8hI0;a zvJid*3u2Mqi@=tY*nfR?Y)Tj!EM^$G>?vmUHI7#TK|XoW#3kzB-pvZOq?;le{s!WG z(eKnjPG7~)kKETXa*0bJS{UO3L-VX2D0^=nxV6C4P}b1N~N0|Euk_8&DG>oAGm3T*H~mZC`*p z85uXtUItWevh~Z0V$W2Q>Sr}lM^{2eqC;lwZa?;`%ny-GxYlH|LW(Mz2)H`V;Xx4x zE0Ycd*7Pf1Vd&DL&#E2j)al)fZL^#?$ADN1JF!$9(ZzauD0x+6HFeB6v(Wh7HBH{$ z+U5(fGGojNWAF-DPqS#dnz&>Eh$D(tm>-O-HC^rxYgBdHhMZ0XOC5RpvI05`8e|n4Qbt6KPa8L{UY|yiA14h|G`b6J`BoINhtbK zQLAGps#shfy?>L^-t3aJXIwy0yrQ)~ytU4f=0rDhvWqaS?==JHwTsrSa||GPmAbqt zv`0T1J;S0T)M#U%RNKUark^aD$i|qWreD<77&=WtdZh02G~vS8KI+8`-bP_z1SAqB z^QLHAzY{l^X8tSz7EAZecNDIp%kBHucR~Sv6-U2NfRMktQ!NE7R#fb1Mc{MPtLJN5 zeuA|%PN_%|VE{ONlHg3oo~uP*cwI0C-{o0m6mZwk9|LY+QUt29=SX7xSVF+nFs`Z- zSU6iCcB_F?JEP7aTa@$)Vmil<*o?HHZ6^f5w$B)Kt=_sNi#FP7&3NTgZMP3iy{F`sB49E68zmVHEC;hE?#~}pEF4}(wCx5pp9&XE%acwiqsppu z+Q+lSYRo`0AAmSOg_2Pw{5$Egz@MaE8HM9s)LLdptyhXk5WJ>bnV?i3W%G@fDw~zW zq>_IoB(BBLU67+rHt6vU`w9X92mNXjat2~w%ZRflsHh3dM@K`miz63I0#5`g#&PPj zND2k?M{Jx-VQ1r+Ka18puSn-+z-FbcE86OSm$>#HPxm#Fxk`qw%D}@>dGyF_0*RT0 z#W#?3N|x~0uh!3~8aZOYXh~1|*sfd$>V_0SuN~IuN#*O=U77Zdroqei+5GE|NsA7T zr12#umnFB@nA$GrZ3^?!#@vtC+dw)G*bzVt7q)3{J*}&9s!|tJ5o%Z{o2PJwkSTJ$MaM3c zQNSW6)g?%?snB!C6t4{8%pCI(%P;VU<&uY6n7DTynXv4##oYqwag@y!$<4K`Osjly zYm2K z=Zs7d=$xFC6oI?};5@fpAK|BgFUQ+YYJe46zT>~$v}Q=eFt{a!!yl(1q%*e7Gn@`1 zN9$^>T2)A8lIy2VO@tmYvp_Tiw?-)RsB-FiI~QW;|2ED0L|AGsRMkj#R{k>Y-dUxy z)|}z*gR`9Y!!F+~@cNH-7T(>JLba--XGs156P#gbO~L*pKHJI`hfbr13z)wsrx3y; ziwz`O4+s>mcpR{o84IskNx{scs-P@s8yXo->_WTDGl!b*c1=hTFt9F`n`(L>_g!$A-YU0S-&gW|99hW`Fx z_P2YKB~+@qYGyjagUn&&y832mY9Tq=t^K6Xh~uWJ2@-)(&p;xn8|SMlwCH>MB-z-> zH_uO}A~WZ`C&31p!r5~5%3rYGB+d>VuLK}%MhBKS+P~AXqUDz?Fp%maXPt;0aa((y zxOYM(S8ns7$CIiuYA&x#V%$Anmy>g|=HA^bY9)z$Oi{(>Dq?UU{;P+Ik_;K#$NE>u zT56+8d&cJC9PQ=Ecry}ZX5OIg&6)b6Q=-^_Dus~3XNT99G1x-CpQs~#_dk%+Dd5_L z4E}Qd0|l5ud3Jbr3FF7Tkg^RH34LiR-1gdPCE)s+K;752*&i@#*0$@}`(j|Rr0E~L zO&MjO3k3hRY&@R%SoHr55D^Fm|&O{KO9tbEO)4Q3sVuii# z*j|I3Mas`bHbTFkEwbE&5sXT%OMGq(Kzan_zPfJDf5iTD)lL z@0hm6vuPz@v@IrcbtXJ$&VLUtdb}VyZwJ^6DKXLQ$kffPYy1!!zxQnn6=Ad4wxMx8@eU>ZEvTC$AA*Wci=H})3 zGG)^8dIUaLv>>1T&$w(u?~1xr=DfKudwK~)HY1Rnfe9EX5~anYJi>~6^`Ga*CKqBP z$Wg}mMVjiGaz9CQfNXBvvZ`20ap&t0=)G^)?dlfiMn;mW43j`=)?}w69YJF7w^!uv z$5%@lc0vK)-DtU$O9VH@S_2wdc#>L!Z;w5fQlrQk zC2W9&*B9=Zx#O1qq$h_Q;ct#~vc^BwT^EobJVhZ)9iV0^vqeTnQ)bu}wAB6?2) ziMU7~WwgPXZBtj?#cPWOz3$@|ss`UN!+;hnr*T6FDJoI~a5*CxvK`3cS~oPedyR-? zwN(BdOnHc6X7Gxa`i5COKju-yWe4aVSLUopSa| z;T@rH(KTG#+gRn^mPH+;xb3Q<+6dT<`0I9!AN)pTd(J$ZAS7<#m2y~$5!o=Yx(ct3 zk>ZW-aiB~{bA;gfzNmC^56=+8BR8d}YS&cp>k-&H&^AbR>h50EV?05Mxn`e2eT8uE zNtbW_DU+nLsbk^F9Wq5$0G9z1unRGT_jHnBPBEuS%LcsT5oV zI?lMOLt~2g&KMosyE;eTU=Oly&CH!lp2mTdA&)EymRYb~U}zE$LY`1I6TsH0Rj{QG z1s$u}@zfClhfT>Ug}}10!u|;FME@ zzTP2NhB@#){kI179tiBl2dfyw{LOU_#D9oJ;4O^0bXJ0)>+C- z`J}at{Rs*yAkkj>y*4=qclgMi&*Ox$#1(J0*!5|Pa9{pg!lp!{77)JR;NXba?ez_e zS(Xebufecs@!`(4EL+)`(+d^Vk#U8xw=W&~=Penm)fkOMI9xXFt_VY!YS1m&tRt=_ zs_xK`qFeMMt`>ZL6GvjOr7isE0%X0S+_OSy;_FhXTz5tYgN==GIZDRgD`L%90>i7% z2?O&{s+RI?mM~G)o(ZFiW*j*qip@*SOhB9S2fU98{7_fV0i4-Lm@;&srvIM>NC*iH zt+~(C1j3M$kwDsn!+7wlA*6_dSU5U{y~JrZMZ7udiIRA0P36B7NO8;c zdJ-=4roYMZ*g0n$9(HHK(ETlrJrgTA|ETR3UhiHD^$oaKdJh>*Uq2ud|;0kz8^>IT^O!TAB)_InRsp7g#6gja6)qd_^yFj1o zh_Xt=FP*-woHU`4rfn1$)gO_tgJEHxAJOS`kvtkZYu%JFVg3wu>YjKr2$yb*D&S{i zT#$`bq44>-JPF_P4E$j;;Qi7XfjB-2zFRi(KkeaKKiTm9U+~}N%xp9ULwUBW01hdl zT+x~}fH;69y{-CO3L;G%bvAayo;|r~_8N;sBN+|7orvL6GeMHWZV&Vd-h5dw+SQ?z zbTvgRvtsi)B3+Qqj&b@s+Vk{JMRnqml&r2*-#EY{4j4I4%wqys+J3i)D;V*g5`BRm zg*9j@C2cNt!FQ6-jJ)1AP%4Bu`}K*DrmZ@au;p1wt(qmOb}lCaCOOi1^7WApa-_J+ zVCJSfKBR~lgKk5)}nrWkIby(}qE6zsZ<<~v~b!CJ{3F%BYny53U**yBrS7Hs(&|Hs< z)oCB4y@u4WOgo8uf$V2Xntc|~HmXI}cA!p7MpUqaPyI z-hVzTbm_>}9N@#)GtV%|v7-PXGKx*Sb1roy+A`L!AwETw~Z zBD3RFrFi1}%gcuaEXanjK8lFGdb)IaN(`Isn;}hP^WvZ4WXMFB`)_NlHVg1~tZdOp z-Peyn;`~@<7SsKTGm_kTO$u00paQThI(*obFBj*a1beQjk44zAcUEWBIPNEji4!q} zoN4a!`_4$@#K`N^pU%pv7vY1Gb}MgnaysH7$*5#11)Z@U)%&TjgQiFXE!$l7EKvP* zR4hN6+x3DOM!A`6v@uJlD#&E^41_qqLP7zXU=M9Ai~U@@$8C`!^0JN)f zY;SP&Md}XMOG#Ealh%GkU*GY;p#}tlt)@hYwzT=yNrBb+`C=- zM#x4M-UXwm8e@Yyw0w^SwE8_eO=ABZ#xDs(vf=eTB%)qPIXl46QAZ$vK{i{V7TfXf zVzH^TQ3Iy%?}7R5^kJnoyLLk4)J5;OuL7+jeQ1+2_C8>J|`lx&K`b4>YY+ihYcu*C6ET?CCp^|q+RDr(?WK;b&L~{5bbDI#n zVP<+kYRBWa9dk7eWG@eH^IxDYyB~PoWby-&AL=H{J)J9mq6siWuU_@a>UNo3KeB z3WfP58JwzTqL=!Xe8jLSEc`IxeWbgX&o2^<0-oivCJhn6(hY=`2ZzfJTosdw9B22l zYI5du(#7qQ4_cwqffsIP_FP9R(8rP?`d*h;jUulWP$cvv@Pn>!{VseSHyRlRe`pOl z{4;&KhHi%NBT$I;p8(6f@|d+=+)_hnf*7kD7CV`iaYqBql4_zqf}Mjz2XO*j`mw zLbz{Wlafx`bEzWoaikE9)-mp99hyQCL%lLckR&H==<1eHQwV2afaUdbaDp;NqaZZg z%vHAf`!Uzz(6DmmJ;9A12g^vHn&kXQNVL5=k@#zt2}4SbbhprAPA5-^J{JK_O>V%| z-eA*@b=oON3R}~e#L~eJbG!cY^&xciL;jiuVoL>br03G_7pds_n$|wFuo^0}(Zl)` zGm$pN`sS*|$qb>b!8S_wGxkS;ik8#OO=Ar3!d}?HJl`h}lci4@>wNX}5}24^LQfc$ zvy&4`m{QPe2JcJu z7jsKU%DIAJq`_?LxJ{jmOhf~OxJ~w<-m3eZoA1bJ$Mr2Mea(mi<`Baqsw%p)^2t$| zi0@!xtj#_z2Mww1lY2XFG0}h`dHNDn#$UJ(5oh*JyD!9HYDxE&DMrr;J^#+*Ctfa~ zm$U_*!WB$C;Vut0U95$Noq6|W*69MDpE1_Eo#Scp1M>gX=qmT^moG!^ABH|?S7qLxW9C+cLqfK$}%?dNHrIhU^XH( zV*VeG#z0I|9sSQn=jhw4dQKkGZAB(rLn>6z!%G0Bhb(_KdG5>+x6|!YQt^71ABt)` zMnaT#o?Pb|AWI|IbEC2+5x)LMS6M+=YD20}*yjD)E5mo&f)bq){iJP9o;n3e?5HTp z(xiVIRS86V1@g^{n1DGRL-YAUCXl0GC2Jv0&D{_SVFouYOF}k^UZH`$8&F8ZKt`s!eP?d`uV zEF&`f@g0&4n*tWMb$dG&6}Yh+ktX1G;fuHHd@71`(D!3%kdRkE_ZFUW`h0Nue0=qL zIEoX@>3O7m-{>Fya1*Swcz>t7fw=m(Ooc?*bU_OtRSdf)`6KzY&(e4hkdx6r zYvf&a2V`e2u{3tNrX&b@WsEP?-oOMs1>|9K^WJk9QPK^g8D?)AOBT<N)%99n{s``vs zN%Q1XYc+uCYKc}A8ZWVQ(1j5v0~Pb3|EquVWFgarLQ zd8x^EhDlic+WGZdnaFV5kkCy#WHtfPBKMm2HQ^I6F0*c?uZ*`Wa#-z{t!zcj^ut&1v$dQ!3Kh@22?jeBa=9 z+Br+YY*yollB4B&Hfa*2IGIM@_XP;`_+=|JkkixBW193FDhJuErgBU?P4W!bl?2NQ zqg*_*iF}KxrwIjz%1|^{@Ol6Gd_adOqDe)8PA}P2r&)#g22W1jyZD-7V9)ND*j;;B z0=COo*9^l)ExLnG7YJ;hEhxY z_X#bB(Vf2ic~F-V0lZ(OA;vYlM|F08sD`u*OQ58Gf4q47l@$oyP)3mBW=+>4dA?j-E564Ivdn{-M%&4 z{OaPA7WI!M@LoaC5fj-z>3_uij)tq^s4e937F@ z*w`k}s!kc^%f{^;cxZ8=fvZ~}78y0XYrR70$yfl4gS}>G^1h==9eKzQ8f3|!LQUlf zDFpF~{xVaXoIuy6f|?#gE&$u7Fk{MW6C9!^IPqBFDC0}vPbnKL< z{4PFTngr|2l(LZO(Gg0zE&e6pT0tX4Vr#?*3AY7FYW^h3m5!FfIU4o!9h~4VjKXDgb|U%)1YW&gx;Z@yXBFMt z*9N5Rhs$ttef2~kOQP%rprfz&AaxEzy(LwP;92WlM>Ak-2>Mg)0H_xQx{%#qurssr z4&D{4`rLf3Q%EGDM@ggBJKd3{o9Yc>+P}KV3d2T^C>MwAKmYZ3AZjRq4E^!cihD#s zxMse8ptQJn84A-`4V_lOA>{D|%sLYh5cnQN)%~jSfni&LxU>Yb{LYF{-?_F`W%P`h z(k!U9wGC(D4yvcg|F>+dMwc!Q-k(Ay(9bqM#6EWSx(@jMIH%^nNpcB_i$u{)o8?4; zO;ILKYu>y}$R~NWrSQ{lGF7_~s}q{oK$Sz4i)5qZDQH~_+{(HWWQom*mNR$DynbUd z^(fw#lvga#p$&8E=`~|LqmciHTP`@=-$H25kfVt#vz_cGmzMNMKVRPAMo7a+eP;7b zh-E@0Hba*RO)CT~Q9fC+XOqM%^t7Wbo=3UixT#YoIN@StFZ!Fb77CEDGLHgw3+HGM z6a5v80Au}Ak#%nL4CXHorY=u7dSXT2Q#F3PdVHgNz=4&T%u7JwO@bOmK@AZ~TfxFb zCahuEEK#d+eH`i}{NbOx`NHz~4TmLXe-KAl-gVhxTfxZWaD)AN2lIJVup5P9m`t0l zzH`MGcq?@{%%0qhl!7#3ux{?<_A;U^UMVryez*M_7{ILAu4`VAR48F%Bp7C|H^k{@ z1ylk+fPkaHUQ*<5F-j-V)Z3OOC8$Jatg+b#C4d(o*fdGTdQJUR(o(2zbEk~`Nc!e1 zXq(CpFN}eq4tx%zi_yBYvbBSr;L{wP-{#frtJkTLzGvndiQhm32P$5C<{K0$G| z&C0DJTNh*W6yu_>{}Aqh+8Ll%0k}3G1h+Fs0NpDvJaNXD%;h^L2# zhbR81)zNL|r{0g%qt)mG*DQPzKW}wE%3)(xTnu{EZzZ(w9TmHo-2KW4isXDPEmE5L z_S1fZ?ZSH*KX+G0>Yb%=OS&Y+54g`2r+~Pj2kxLZt4%X) z9`DcG$LHM5H*zm+r|Z>b=Fcky7BbWsy)FsQ>o1{Np{D#XP`i`8?7$RDPE~Xmi_zpZNlR-O>}jFY$@}kw3Ib?V|fd zwP4ozzf%*Bh`TJN$`mexX$dC}ISY2{=xDRGqtem+D(#G{oW14k;-*d__DbnZTr?a? z_arktAvSH~E5PFy&loc1}5H6A8O)f=61%P*BezPBc z-ywg(y_YlSA7Xvb6M67-q-C$!je}5H@?c~@yol9X2LxHC9oAXg#BVayuJc*a4p-jX zZ8&%&F@r#eeS{5f&5dMcS8B$g3~eo5hMMDb`CLw zRvwu5AxlO6VBrVOl&w9h8;~VOLv*nJmN5jE5z^wMzo4BmM3V#C<%tjec!>%F^6W`d zM0Z%ohUYgJ$>Wc6huQ18UDF^BoZ#)^ywCDOVL^rUpbeSHD`ET6N0WrOJ{{=M2jM4Q z)aV?Ce+&L!YI_30Ln96{vyJw$KQCLo4=QkG3H0A^dafHaP?T?Jj6M;B-}fNo5gG@G zNUFe80z4ACi@Awh>ZVV5BVxYQ zh9{}$Kxq1KF170DCDOM-T;*~`Z_{-9$^-z)D^jHl-YeQR!@u`MzT8oUn5kyxn9kUu zsbkuzYu;@qx-&=Y>M$}fZLK0pNXV#aQkT&rL5^5*82oh)UY$o|uk*j8W)b>C&kal< z{Vy&Ki*el8*EY+stUtJfikruC#BwJ#{Oi0ot`DX*X47xzhThAdSHYgU1(v$z_OX{C zY=N{`D*~ueB}VG+BNno-Gje<0iY+$H`tEuT>???k29mUk4P;cHLm?K-B987D1(zgI z`|1CHR>(4^=I{{tfM&>9EMxb5E{Sop^XCWr<5GHswtQsKe}^x?P;q~`kW>#-nGnT0W?TStIdyTA)@c@=@?Q;Mo+2v6e;5r@Gc*F1e*oiLCFMYh&IMBgJtO2i-e9wAdnfyX zZ0NjGQe0$=TMonyq2y7-;vWcZ^Sc`-(ACXc$bE#mn}7Qbrl`x} z33p%O^fgYnfOZ(K`_;^k*W)DRvNqRU{wM={KVHBBp=04X5A)P_%F{O^hUrob(d?SEF*5K=ZKAk%5HOE1R{VzczSAc{uavd%C6oIA+U)-(hxowDs5N%AzItWre1k>3_wzo&>zd_IP&H>F6$bYQh<>W zn8;0V+UX^?RmSV@=rD3y20zMd>8D9CrxTn)$rO_%VO<46x#*hLQ0K(U-ySD zO=0DqTBgReW#GhyN*Sg>9!IL6IB$yz)t09aG;g&H6zKs^lW9~h_livm@BN<5hR7{- z7P^_OV{mW1oVAN2T>%H(%;q~m`MS%iK&aM0C6dA<+2Ks*lC044YfRblcx zr)LZPw&3qgDNRa7P@z^88)4==%^2kZ)UkI6@Ji0C9YxTsY-b{nWX88bE{xWUR>w9WfK4*$dIkiOOfl@ zqf)5z^NV6XX+BHhWug4qhx%Eeqrw+~=Me zw6zbN$8o0-k;>9PE~dA)cl5n1Qrn#(X)O^LbhyEQTts1IqvW`=4W|tCEeizxIQ=nQ zfeteu_L@#7sE&%&+tr{STwKH+ArEeAMVz>GW)d*?#ts)^Bz|TG&Oq+>f+I+0tw@9RJAL}{xrfB}+$>YhqnTBk`u0vh zAvom9^fC!i?+uyoMGiYNryLj;*I=N=(7AVX?y=+PofC!hQl(DJoIc_nLqGfH^%?&p z=RL|Lwpzr0yHgRG9$G|BbJLizV~ECj|r=K!Rs9${6F9Q=r#&D=3&Mbl8< z*O&<+9a8GZCvi~&C01NS>vI5JA|zJ3WHECIT3Ml@hC1_njSc7Lz=~_l7Oq~z7V$q< z+6a97pJL`;JA$_N=MGklVbAERb`4o2oTEWk-=x6fj0eKFOPxc$qnD_#5dhLv;hC7j;=S8~7}Z+4kPOWeQ+L6XRk^oQ!IUzTCKLG>4IuJU29 zVV{ZWtyqyer@(rTvk-R7tZnnqDOd47Mm;^@qenbM;Bet{Hw)_{GTs@)4S05)MCzmp z0ICm_X&gx&&PD#Kkf4e`?$$#-a6z=wFFEnCv=MZcPz&AbiMDHU{C1oWkaya;3A5GA zahRwPY~B)X5!cq!puo(_uH2o74nHQDtKl@V;`E7>5b$x!x#^3=lvV(C4F9^6kwEE( z+XeAnDExuKVb4XYb-GQWG+y5bF8ogGe7>mkl1m0h_g8|5-#yZwzJH-gyFziE6*1Hm zFpXsVzR`s=?p&eFoNi#{nXW$Nael*RUs3H{h#}x~??7C^4P*i4R;|jhEbIbl9ollHPR%qv!p-w%t;E7M3 z`k$_FBj8;LRy?W6ZW;CLJP_90JV^GBh7394r6Q#U=KdG2C9RR)px?iE&$VJq$t0)= zh9BAO&+XM!_Gzb;UEbdn%H`rt<~f0@;DqV4nf%u0d;+Pz@xe?#O9SxmmT;V9*o8p* z`kMg=s<2mZZS|`|Cl7>;AdE;I6Ge+f+>h zh4_UrP6mB~UvA%Aj|nHwnZX4S+?}GeOT~h^7H)1S?$l8ZYl@1Bb>QWlmxU@qKG&a4 zL7#q%iqpx;`z!M>vCtH~yN@5ILD4f8W{)y|XOC`%vNz2No!Q6aGv|tc-lRjvZsY! zabZxH<3`cNVEZL7qM#yoycP5Z$~$UeB1Du;;|JzK`~EX0BltMmzwtKloiDAdod z!WUP?91heoKI3^1L{Uu~DoCBQ#EX+gg!!6WfeC0+fAlC&ravL=22F{FLEEVA}>gQRw12dYjF~bx$B)e zK_u`$FP1-7B{;|wLl^^(;;6eWNEE2$Wt@s2at@yHu5q5WfL-Y36Q~-ySpp>Bzupc* z=8Ye``$yj82*YyK?s^T$aeHg;$nAX+1;XtJv(ud~qdvapmkpWrv=aSKsSMmd@6nKn z2=+`^AHb}{lu6y)8@F)&3IMC+xKnm|3yWi=p_6gzI=aQWb;ylq)&FRqNuq&q0U?#+ zmoUW;F|Yqvq9WzXJ@6m&CKO3XQ{_xNUIsvXAzwVRl_KSSgYdX{wA*_8QIg@H_(+q+ z*qeDL^>NZ&qyyCU@u8TT4SKEj3Q-gX?33Kfl*CgrjPyjWh+Ibzqbt!>Yz+8=f`^rb zrydTtfhS>(iNum?T(+|JeE7pSAOJ%uF$vWr^uJipzE|Mx;WLVpQC|bmK!&`y>eV~z zUvW%Ga~l?i#qW`1mtfJa#yDj{+1&X^Chu|(n0~9B?I~2F#?(R--FJ9c; ziW6K56n7{EiaVVBU!41lBxCHIowepW=X|yv$e_GbGPsecHuoQJKIit;kxcQLB1((E zzUHq;V(CsGiFf3_Q)`^>y7;B19gjxV<{wx?y!VafaaF-2QeIxMv8O|lHQ(H0rX-PR zhV0t9=`p9*DVreQFFfG2EFj39pT41AD}l}A6T*sjsza9(ys4Gr%K=NvCq2Z5FN}DH zTR|aUH`}O@v{D9(`8^c=j&Af^#Tdm}1^J|M{4222{eK_JPQYHz>~hix^C#{XLg~hx za%G!+&RdUh+49rB7;sU5I}*%m7U*U$LKr{%Us=VU4D%br7<50rLTzSF5_AY{@+ee7 zOvTzm05OleWjyp}=JeqRUd|DGY;0m`yoFPe=>Ye@p7mO?&!18=Iz<$Ti4+cW2 z;l{D6H_8Ki{p@JiNT)&YkOq>+^debq#<4=30sxnYU9OKngar3AG9XV5uZ|J2;BU01 zWCD(EyI0=whD)k{b6vgcW&1A$hDbUE+NhMIWquFH zQ7c{&n_{;@2rpzk*4X2v%D@R70mTYF$LHbP&Tl08x`WbR6ljr{lS_)qmJK?`M;oHb z-=BD#Lm{PD$)6^N@gIBvYD|fGbz^rsq+ZqdTem2qmeGt|(j>vC8BUXr9cLKlHxCE3 z+zc~IpBS5F*=lu@)_KWGlFK2+a`~*&I1T(X^!mo;K3&t8D433>rhSkl$Di9#C6+q> zC)y~paOY+cPSYN7KNAE$_F~m)idBS_Ig-P(O$$H2kjd1~_WE{4OjL%gF)=^Ohd56a z(|v`leiTLJPIBH)Oa^69h1_A0|OH{XC z90l;m?Wk6E}(OGUB5fANOu7j6t}2=9mS5eGWSv48JVs3ANPuUjx0mWC#{uZ z)Me}D_QsyRg9CxaeTLFM8kdVm9Rrjv79ZxZ+8y^3zB=gG1q!~Z48 zfE-z}RRY)*l@)=*LT?8y$(A#YgJj#2wW6>PBb>faULXCX>j|ac z$9E?o0tGpW(x!U2rK9(q5&6X*u$qsAl z8Pe)hCn}XVJ$J9eL*?65O&{WVO%EP`9YDP!7r)&$D>qI-{j(@zDU|6@$Kh`Sdq5!Z zQmsiRI+Pg)M^fUwyTFUkNkRDrub zIAN|?E|#06y4Bc9Ajmf)*Kyi>CYP%N775??D*ZgJ;o)J0!}JG@&qp`B<*6|f6O)ZS zz6mQ~{A*{J97#L87 z@bKvF@9xxpQ*6taATVvo|k)~*c=fL;_B}s9OB|MHc|`$oKJ> zj_)R{*70nD$Rb|kgXYgadvf}{*8@}C;8IGGr+pCV^$EYVPj+P-P#Zy4 zV@z#p?FeRmTtMN-6Y&csP$V<$F|;UDl}a_I{pJQ#RH`K>o2fY|va&h@Ayu0&5DJbt zu7ZW72f=3R{jy7$6I!}v@1)Vp{&VwFN+VSam&^RE&Ir&j1*~G~jHymcL_ub_ zwx7a+q~79}H6&HOAdeU!Ns_jfC~n2I_DiPbopj(L8*2b9#lv_76%~XX9C?c?@j~`a z)IwhurYtxMaOn_(FB&doR+{tMPPKGJ z{$hKz+4vByku3@b@U?{>Gb3WrzZb*wr=Z%QelnIk@)DlQ8>E4=M{+vXe>>~kJiK-( z8y(!aUSoDJY>RF8OR9bOonD^ea-SArN@O;U2RHtXhIz=eF!Z#25EK@7qBV1nw%p-P zI?qFYC^v}nX~;QM(c?=|{m}0*1o3VKDl$udi#)^L7~vzzk8S4P+8h`?-xetbbQa7 zMJ=z(W6Qd0tPX3{u~IDcFq8UNW1=SA&WXwC+0(c>7Sc_OjBKHw2g9`U0JO~B*6I46 z%40WW;W-YR@Ll@3YWc#bg|TmKNeYRR%bn0?jJU&w>&BoOLAGnVCetw3hf@?-{ayx`k?d zXMIsrU+)f4%IsaOJTUBQ_Y-YxZf~Di{g@H=;FYh0iixp*63|dpG>lVKRb#44yQm9D zWN6Oq%%WS#inK&%Pu#qNkwQEW`&nH%!xhjte z%Mp%sc8yK;Ta>Hw?C&uS3fcD@5V8QFIoz>^SZ0VPG|=>Kkb*#5Bd^CQTLT#?!hgHb z%r+i&Pah7$cb9j^Sat}gnAXmKU!(w+VrIOp^DKW+rsx7+-X9NZuSw8x0l|7@wa10FvMTC2S`Y?UuI-_Fe^p-3#@u?mJrQW~ zD2QUzm{K_uVw(5yxIf1quQs{6XBg;$@?=zVs~WnyAb$2)qOBw6Z~Goc8B|c(OTB5K zchn!(-E?@3TQ`RY^f{x4E~r07mUB|Ceo;2x(S1M9W8LDxK^mi37DkBTA%PJtZaZGM zdLD#32B$k9-0h#=o~aWLc+Fk?gWX$Ue-2nbmVR@kLGm%X$mKe}yx-OVeU5LCrlODL ztm!F~W%~2`HW_dB@R40U8!!)mL~$B zc{uo_og(nu$8;u!s*y@AhvKhSnovMjHed9$Dy}*BDn|E#{vTz9XOWJXyqA^rLy_*Z zbh{9lq#{@!Uf4HJnxpk80i*Jn3{Eca<6+SDl>{Of#7202`UMm7HkbD?WDJIi&(mxh zr2PmAxOjU(l0Kl-=JU=%Vu>eT#tgJto*)y!4ekU{Q5o^0H&lGLLXw5y4n>iOYf&*g z+S*m^w(*3BCg?U#jExz*2Xh{ioKCU2d`!3E&Gv-j%OhrGnM2#~x+4km#Tuxa*#V-M z)VcDMOvsBixr>WiY!=#U zYwrUkoA8?%Vp=)(lBN$_o&p6DTs%ZLdFyOlZ(<_POp{ERC1rX2_s-8}FlM4WU8aHl zPd9z%W+d+yQd-(lLUcF4{Lkll$@gIubpS^{A;~(iHqE-mPBk-ckW>Cw3(vBxEx^!Q z)K5ycEWO`}!g)ThG%SS5sxhZQ?%!?t?YsR?E&L;u>_7c|o{XI^W9_S*5g{k9pw}n+ z%*XoanXjGG&5M)|>gelg^x!A>iEro0RZ|xuB9CMu9yURS9=KTtG*RUbILB<1Wdu;R!!i1TxEzBeE! zA`V3B^13z4wp9>(w_pmw`F(!_m;(7wDKq8cS4T#7iFJT?V?B0#d`Crj`M8?*B#K#n zDvU{%C0p`Oa+t*>WtD(mtT2UeykYoD`lQ9kqHfvzJF==j*Ga#cQ09UJDOVq% zDwQK6ne$W1#9M^QhP3Z1wp0#wloJ!ie_aW0{^yHgo(JmlJ5w5T#ugd#fd6@p6p5Vu z&Q`2JWl8en9S~fQZ%O3mrWre8QKYvIzdNRehXvZj!f%@Ka5XG!Y~uI#^+<$0GosoV zz)R9;>J(dlZseF*S%NW5?e@C5z7D)l3 z-J|*cr3K=8k@}CvK>#w7H568_PRCclzp}P6n#SsHdm2g&^m*VYJIs z&UDuN-G2oG6I0VJcT=Re8Z@Q!z}Kwj<`}T3gy^fl(oiy}abWB--a`0l*8Uem>GwP3 zBlin^l8P4d&tv1$mtm$64@b}3+;`}w*k81lX|yvRR5s~$Ar zESgO`h8;TzG@j~S3kU^M{Ja5UUl7(DVrL+vI!7JmdB*1Y=jUz&%C`5nk1uIw)h4Po zbBHExUUf=g*V5ApGiv`nz5SrE@!Fh*^#vA8cwmi8j`1q1A_}n=uKxkdLRp?h#$bAdeT#8_|u`tnEFZDcu0MJ zHg$9Jqx)0B5kXTg_EVh;7#UUM@BKwI4kj6N2X2>*;^VvijsD9BNY=}_o?~ zK3;EJE_m-#bX`tSFPreY4Zj5Ok%SPsP}1mg6~^@0k3x0667b>Txn`UpyX|dx(%qUv z918g8tj4zyYkE4gfCpLLqRuWvT{woH{hx3C?2icYHu+zFs#t3ir}62{8n{2LT4jQh zxzt=c3VJX_zVN!1mX*{{}2-)sNx8sMLBfg_Y#8sz^jBNAocd$~IwKgXdNE8;PfX(BJaGGgE8W>!reVOAukNM{n&x3IQJvn~H3r2stS>!qo2$@2s* z`21Zm=`5qWe9nb>Jbw<5p|)*ew;A=*9X6l}eE2hjEGl1|!S-*e9r(nb64B*PyQ?aM}7lt_ji-iUmz*ddpV zJy$p$5>k793o9Dy2J7?lF5kF61=%MKQho_kL@C(k!S{UU@;4YBp^ufvXKO^?aGZ(g z1E);J5Vp(#rXjb01vi(B%eB1H^!2)%*}k8I*&5c<2pdZskAAK4%GinK}HGZWN8t!hg)qa0E{ROKwRZW3=Xfxg-fA z3pSsnsQc#iVvDm%3$hW4E)dI%k^z$4gf$aYdJ)ho+!z`{fw?VzmAl#h!-$h4X~K_+ zWnA}+e*eLnX?*aSp9CG&09*_mM^qY!2|M9`m;h4b*-)PT_3750O_E>dFH%BF8r#`M z{G9P?!TXHE_N{XW(cWd!p<$cE+MgG;vi>%8F)3N>*$2wDuT)(!gLkB)0RfL8Z&^?0 zB9p%kI9?yeKbYKc=0E+l^qOZn6N9>9mGIsXclw_(Y*$qpi{)_3E@4 zarHS=T83>hX%^Z5MoKnr)-hJ6iD3me)B~!B|CeYmcCyc?s&&8w2}`^yuP9<*|AgWA zQ7G>;_95KC>q8^^)~Q1PUBGSFp{Oin2y=!ilitqM*@L<)t$UtIp3C4L^K6UCAi><3 zA4{`tAz+2fb~Q6d=_-HmI=_*fU24<`lm=;aBtE&c-H}KW_s`-d91nTuaNCBwCxYgf z40K}Zcz$iUSHjN?rBb`FF(8*d&FZt(GJpF3*Wnc92{LgtUKc&Zg)eBFLQV|`w@(ZE zkgYZ#HRj|Bwt5}4pTIf&?Dkln8b}b9{PWS*W^*sUcX#nVY2=1jE0YE(vt~~Jt2x-E zJY}p}OD;EdKU?$-kPeL^pnZgRcS2VZ6%;)4_b2Y{^ zBnvK0U6%KobP&!RzCKc=sP_eFiMV0R(+mW1qYV=q8yj;k#rmu`v>edF?RHb<`R&2_ z&$RX!AKKwI3QYJLChAC-#c6^}bPJCQ#2C>72AbTil)lvax?`Ed2;593d4R2{z0 zY{*L{@?Qh#ok;$dpi>Cpj-CZkmNTWvnyH{#ON~tuPNd_KThx2?%NlJ`#|= zyvB@dgQrDh55AgH3{eb?j$t)NL8C@wkYtFg@i%u^a}W7pJM6`=+NmnAq<4}~Wddl6 zms1*6?oOO=PWKi1?{%Wa3rdmFgD#u@_X0e}dt8o-ya)jRR7fxt45Z4cTJM@{1h$y5 z$BCfi?EfX3WX7rUUZbdPjw($dOEL3T=4yQw6YlkUnpM%yuJN1hfU>Axs>`UVY)<7N z*1P#pa=%89{O2s{V>eF+El@P7U8$8c7np}=8gk_x3(Jq$K4e zO0j>SIpJ~|;x3?9ZEtP;H{QhImV4nCX-;SrE&C~Es?vg=`(VAZ;CP&>G0}-eXZSV> zN4;{-L8OThHrkgr_qC-UpDe<`~ z3_S4imkXR1OQqW1QY@8wX+Si=hF`h@KT~{J0w`U~RPFTSG=*N4y%?o_hgN8O{oV^K>iV`Ya zMl2eRFj*Z;>O)d{Rylg8M5ztvQ*6F>bl0qrqhlnLW)Ko?fp?_8Nh9z4shW2E_8o8- zJ~^oX+WY-<`t}1B@UZ7+2S&dLdQrwa?JV2)R+kBW6%}LW%m@5aM3D_ z0BgLmTe5Ds41Pq@uNLdCy^+N>RivAPr%H+DnVQ`bXU$A94bg?8z&%j-jnTb6w&okI z?MDU8M6=9UD~ST#;R%p?r`^r!VT1h0K2stB|7P&)$9c z*m`TVs_f@$=OC1HR_Cr}sl-8`PSVNc7p|~hfn0FElK+y2>b1D+KK2W^WCk03qogpT z^rTGHk(1O@Z+~+_&Qmd%lsH4 z;(OUe#tuq*Kn?Rbsu)~RqbqM^1Uqdru1{qw^;`;9g*CtFv%0&Uw{HCnGmbp;vYkkV zLmSZ6{l)er6W*x)`}e)blfi6x4%ZL!+?k4HCi;pJ4f?Ed8SqI}WykOD|M>-2k2K%E zpty~ys*#{jFQ3%`9g>E+fAvZooelp!&v|VNW!-$!!4K*CN4vOBFYc|<6#wVo)n~~5 z;%0XCw&XUnkagcgUu-9}){mf7=w7oacTWU38v$dqLU!2xT5#ewemO`$7zJ9$puR za*O=}yv$$HK+0x2?7ADwu4OVu(?=p#e3ckIY0&EAL9%_-II!z1H&Ufh-KH=F8uhPu zQt31|VBb|`Z1@yvedAK zodkLPM=21<=%>*dSMAaneCTFvTrN{*b#cttQiR{J$`CMTp;h3bvL3b9-f6DpRKaF< z5|Y(?CvvN8phKyI4bmxHIsr8N;dL(&i}$PydfcKF&$jTsrCrC9QQ%w<2Lk_AaxFe2yS=9wwRk&6ac z;mdv=+;TL@CIK*HUcxBiy>5>Sn9Ik(*LSs^|5AO=TrjvURKx50na=GmF6c(Owll^C z62S525hSbp@uiW$;mIkpudB5Msr5<1K{f5h=OYrNyeu z_%mp6^w_r-#+a(Lzarn~o4_b@Cbi3XhvE#z=riEWAXMmnqcp(ClJk%Oz}^4@&sia{ zK*%=c0JjrK_N>+5?HET+@L1XFA172Mv*tyyRLO$uNehsUY=NzD_HDz8&iDTR!o-Y` zf`Q-I9Jj&PDt?+~19K6+ysNb$XWE|mZ#}C06ehgVtJoxN1*8LkouPVi8fLb{{hON` zn&=oRm*o?nY7glp5TpoHsz9I)3{w>qiIzr$w0S2guF;`EiPtQ6WNexqT?>Y1Lr=Zw ze~`acP>{XoL%Ar0lR;*}eY_HXlzht~!>4B7MzLrmplc za|wERKk`TDvZQ~nEcg*oRZRBN6r^$PSTa&{EomUsuQE6bEIx8F;5NeUmzR13|B z;Rcdse8b5kN5r_0C%PCc`i6GHJeem2dV6Ient=^1TYHv5bpDr2h#USBD-3_bJI-A0jQ<}$?2jI$U^ zRcM^?&gOitgO|J2nao`!X<%GaxdB-K5$02z+nOK zYOZ&Wlfb4z?_1#XOFXH5`)@xfOgFHQwi0q?Pyt#XWnTuXC;$DY;cqgd->uw*EU!f$FHMBCt-;BJJpGWX!6@-N=vhSh&$$AcWr z99o=RAOnG7(s3MvD?!;G(^-aH*Jo5x^z!Kt-{WfZr0#VQvIV|t2w;Pc_jP-h zO8^5OKD|v+gCDitQaA6bH}|Gr53tUJ{fS33851qm{2y^e?%Di9$bF{;kwT6q5BVMi z4`VaSQgqPS}Q32A4 zwqR`gDD+nqNryM_zR#31=|@B@|C_R)ztqXa~3ncO5} z=iEgIOAIFhtD%rRTmB&iMJv)YT{J-E+diMx?})wf=oH$nKjt1gUcxj*qx3A7EUnEl zSY4G;)nidyWrSqzE8rdl+_38oafBDvYExqHQ!1U#iZ)%27rj@%?I$D6==&nFM$rEK z6y(+&qdxcjsXHJ8@%6YsiI-~L5xJL(tvDr`T|ByCVDPt7zt0b*C^iyYIB`4c*hQbp z7fGOGILhjSCDQ@@e&X-Z1tR(#-J7TKgUI>6G+o(=Cg zz>!^f0;Cza6`o1sca5_8V~tE3hs<~^cAh-d(wmz2f6G1Df+ia@sww|2?GQhnL&s33Z?g91bo>J zK)Gt3y#BP0$70l89J2}ajR?Q!ka=#AX)+3IKA_c_2RI}+c->(DPj4T=Jt{xH8fWn& z&|JH=V3g@K?i{mpT55ZWM~zOJ8Ma1$jEQ?Ee(y6i#+R%_O3X$QnSnrkY*!-ZD8d4? z_!mTIBq~y+zLc5PwIAGwpFTQX?e8d5sCkc}5z@<|kG@&h@fFEMUX zp(B^4qExkoNgYsLa>>3`(>g)tbPbBszfn=E&KFQH9Bu#+cNpA3vrGV;2@1fe?F{IDE;u~ z=F`WIAGuFh{st?OL|A2s1#lOe;bpY3I$<|-{5E;3W5K_3k|@{S{`U_+JTu%5Rt#Hl zN@}>#CL<~KQN~lbuYOz(>xbqre`6G2OqI>7I5i?-{OW(;g)X4RO>=OYEI6@-l^hjA zEwAIyr99<161G`^L@QpryooZEcd$d)rD0E3RyJQxnl2&mOU5PZ6!8Y#r@q@ly zVz2#v7t6UEw0s(Q%Rkw;ZvfHIFavR~ZnKkc_#HsT1U-yS1a@C|($pxfO`o}?Xz8x> zfAJ`?XDK>;q|PGFo>&Wn83n3UZcmGqs-?5zJ5vs@&e(Ynxvp~aXpR=aZ7Th!uHiUC z{jr!e5u6B`M8r;j4N9`5Aksvgosqf2EI0`hORXvAEQO6Xq92O+CKy%FE zEGwQbSlN0bNpl$&bxLF?O{YqEzVWMy)mU&?5ZuO1H`o=NdM0}gl{D+uJGa_{Ir|A> zJ^rT%KXnChC|4=45^K^$QTH1SH=SdFIErTfLrUdCJKT*90#(YFQUQyq5hod!+Xy#r zLcPZ+BfPjM2Xb)`6LN4)2!YYjr)ZF|Ho9i{m}hN*xghs1t$Ov`N&>cBCL-%BWru~N zxfD=5qQ$!<`!!5`0c^7M-k?H@zvt&TmUuOH`Z74W&DcdwA18J9Po}stCMC4+q&ZaJ z^1YuK4BO_0U@rExxQ>45-bKTkf643GDcv=7vQ%rdRyKuxa?1nprDWrL=W+;%<@JbA zbP0Bgh7mVDoQ1)XbxjkHE4HnvrrvMJ@ZC!paMyD6-^Z>fG|dw8s3e#$M>wZioX(#N z&DFt7Oswy2hBeC(wErfmZx!6SkJ2ESA7nssODMH2Rtc{my7v#vhm*HtEs;fHNKgCE zJfqYqT=dgOVAEd;f=jLOhO`IbFtK+Y0+M5t=wjTGG)SSzu6e~r6;k+7ijMVK`adLb zB@5<{nb9-|aQ>J$>*0>h%KUX8AnBDHJS?OIP?lYUF59JWe}`y4vXN206^PyK1mByO zwHakUAB>O}sFz>82D}*m=0(3xTUzgX`fBHNfObwh$-VZPX!zsb2l9Knybj@EcGR)( zsq<&H-U-rLUz7shWI@jqn=91=R4B-p0fAc6^KbbGUwwl+&aMCKrZ297ZiWc0YP^MB zFgt(eF{L{<4a#5^MXG2sYIHOHqG?(C<2}KsjYdNurkUP8Ri72(a0|0>8sheIKjqRD zP)x@Np@^k)Gq7}XOQk?eTc4gHZ7q^83Dq|EN=>L>)vViecL!t1-L6wuBmaIPkQyAt zAl|t0Kecv*10aR0DX;Xpe-K|>-dG-FN6m^u3;)npHh{*C@(WtFXww`j%omSXDy)L* z^zwM~@JbstNOvU!P{$3~3w+22kA6Q4;h#Wi zD^ALk|C0hOPF}$4LkU-%br$d{-EWmuwY8?SbuIPrD%C0sD-!L|#RQSgVK`+#_6-5x zuK`^Pqw9f-je-k2nnY*_CiP@txMpapPCy+F13JMu4<(H!PS$Sv_gMM z=}-#S%nos5G2#(<+GO*yaa*3E)zdj!9)JdW^yqS!$&Q*1w_#WtasDJ%+aoDqQJ}1i z9|nI(1o!UT?@3RG>6>SPlE4+xzTSRO4D*^;L7=$~P@TUW3#Q{>D;@Ig?jg~jOOB#% z>0$el((Y~cu7a7KDV&mCWa{}wJ9a!KU#Ck7B_vp~_0B|PSYgDno|Szvo4+@vmcX7z z&froGFJ?$YM^nX2yzO>M#87tlRyEIGnmiy`w&f6sogY=lC zJL?q2=coKP9^ngV^6k}te@loj3N_*?fdta8S-OocM9iH!k(cHzW+e+*4=yBwH1ufw6_86aE#cHEoz4EE0WGg&L(s8 zpv-}{nB*Sj9R5TL`iAi4xt;5a`MqSaYQgjHV98oPnf8MjtENP}5F<`wyKV^3`dfjZ z8eVQg;_jX)FL2M5{_10geCp1v~cFs&C0%NyB!C$^QWVLvCkps*z8NQenE4y z0_KqZdbfNU9H#UjgG|E|b8MUMHhe{#Kzr2;X~KmRb(dAR#PIj|64h#I7~{TkCeXa` z5+d%MjHOu*%5i_9&Z^d6G>>7%`}V#eWBKZS=G-4qBgFPs-@I#sJf`1Bo?N{N7l{&N zF6ZgYJCJFqrlGTwsl!s@qXs=LpW7eY-3wd?9t&`GQYlBzxk`olMPsB~dW}&z?X*Ep zY$-ADBq}ZCkdv4i_%Uy4UIMdn4YdEXps6Kel3-sp`S>W1Imkj_+&o*{+&%>alB}w^ z9Y?53cd_m^J;bh{gx((~Ilu*+}238$y0=JrkGQ%B@2QO`u@0h^skd!f^Q7cro`goaAUz}n}$#Jt8eu*WwXCrx%5h_bwIc1g*in#Q@h$2xL2#xz> zK&@auJ5b0Ny>6VQ%!(2{-#@M-K1{42;kodfb>$ZTnN`7sZ^!|{S!)D}Won|CS&B%( zM*QJy(KVOJA`i*Eu1(4;(JO_RtR0L_Ti7~j)GTol4vd1Y+xE)eo3iY=@)RE)I~D&$ zO@sR%wgc(HIbqDE&4n|xHwhSv6I%b<;Dj-pU7eVRYaFLHfUM80|N zhrLFzyx}^3K#lzMw@+RQ4!A$W?sE$@W=CqF%eOS#^X|iT!h~`q&{I#zJZFyN!dkJpAqstER;roRbvn9{D{#%} z`p+g?=E<#x!#o1kXK3u{GO$mMvU~o0AgHqqk*yxyRr+dnM6;(OR%z>OVHtN}7D!+L z28IZ!4e+i2a=^HhheIadXXeu|LjLj@5LWpYnP#)pQp z(c-CSlQig4!Cd6WjjDCFVdI@^9!rp7X35#GqUh3-LE}KeAlRs+3{%lpsU^Al~G7l zY>5O-p=9E3C}u@D2qyM)MfKy*(S@3&fTgk~>%O^lIps_3+DCFu<#gpH1UzzF-)I=R zS$r68@Vs{rflc>3O@jaZIyZef)4FJI@MJo_-_AeyAaY^YbsPvrjM|O0DG|eckl{!{ zrm2#RTk1Mi(6`2T_$!W4-`GCY`;;yM1f|CnjC)A*9L638o#?EC!EBLES&92su6JOZ z19-d$5W#FlF%j%}xDK;~?bTlcf5W0wWABgUTiTx$!A$fBzVNUdaiAyUR% zWZrBy7Mv}HjOWa8Z z93)!g6ZR0&4UnX)pRl6fE*?-xP;Hmbu~=YaDcwaHa)vlk9X{bI%sUzo=xFkR`Su2* zaP;}!P_s{n!QT7GS!zG;Ocit2wxbSzCytLgM?+}{b%*`#dU6Qzghx`l#mTg-69<6= zVJSLxOxfLU#9p`ti`>$u%E@>5 z+3WWz`kBM)U_VYm?YKzL2c!FxXFrFe-h2ixiO;(ldTvvleEYU6`Ee5in72}Lspd1s zVY_to@+i|+N7kPf7xBM(T>?ZQEw7z^%&)4WbCI&5J7W&2|ifSg}g@uHCU@U2vd9q-DWKhThBOb4fXC}z_n1HY zxFXs{SHiFjtW{Bg{rJv_ki{z?rjQX5d03t98tH%W|6YLde1WOBk^G;+Jt4Z~m=j{M z`;1zwUroWc8L`6)CkpcO5~6(!nitPRZ2F#g^pR18p$Fc{Aur-%ELe*kul@WDAnka9 zcDSB%B=7h9bKu4%;IxJm?T2j@);(Ex@r>|M(mh9X&G%0NW@2?ce00QdXxuBH=noZ> z_)hqZ9qzH>ynCK5amRyn$T)u{@kY7WKR4i-@JptCCiD5r0aB2xb>PTB<#0{S%@qu_ zG}^)m7uG>|$ca}ePvviMgRa;Pd+w=-v_z51&vJ)wSt=D}BG_c9wUFu(Gs#Pdcm1^V zJ0T1&oe{E4rlIOucW3OM*c!y&*Cpztcb(sbCF0O2Vu2Xq)lA&n@D^uga5==E2GUB&)e@z`%yFyNw7*;;4G>w8M2pS8UzEY;Usn`N&<+sv)>M>S&lg zIy8qBwJrv|@#hFb`oUJdXsOI~1ZhQ!!Y4Yw8o|cz8Y8sa*B3;HCPc8P{P29(6Ix~C z+VR1*v&$A0ALxO-BZ{NN&E>=f?s}YiUNlULMj|dY?P0m$`tOZ=@gWrza%yk}bILC8 zn;0s1xuOA~7SS+>3NA>}!qim!hk~zDcU%_(rC5kQ4?JS&QDO3D?p$vCCsDO|%E?Ia zccYRjgPvdu&dkVCGqQ%1LowthsOgDHQX>dL|EHRDQrg_2)iojj1DV;~k@Nidc4>Y- zn}p=Aist*8w>~9GH#V2sWn`_Iuls`*$|Brx;GCOJ!&r^$Y0qT zUzqftF4Y!Vr~b`~++&K|4xI1i``z(2y5EJUS84$3dhdNqZ@*yAF2Vf`#w%ZK?;S4a z7YqD3ebOcUXg!4#nSy^ZHx6%HB<+Ukh4TWZPoJQ7`IJX_8U!!48LcJ0x?Y3XB%e>T zK$BJtq^{HzBo~LDWuSXjaC>(bwVUB{-tCcD!k#G~xtl_tinx=rI-Mh$78a&dxkxq6 zDUgdUiap=nBW>qm*B)DgO9GI&=MWgC;qO>uOw=VTm8&(={q0V-g_|vs_~J7aCG$dT z|5VvI{Co5{GxV z9Y z{s&sr;~Vc{YoMW)fIFE#G41dHI|-hiz^>~>)SIcGll%s^F=ieA><03vj$(s*ln^R-;Zh6m_jo^!Cl;^MczR@USOkN`x zZ^(`MhuhL*`)m7_4}%0`+c)PgD*opQBC!0I#Y6tLXG%ej0GwLy0g;`&CBW?~eCu?^ z?+4ZY6(w^x#H{z)i4=<%$1w`Z9KBOGK)v8rfX!)3$Y=E%^w%AVGB(J99ZEu0Pz^L- z(CbR%D&}#k@bG=yD3XZrY2h&AqvbODkvf#YioxMw1aFw}dDysiXC|ei2rZY@w+xS7EpIyPs*jC!NOf!W zv*M|skp|$qJmv|ifHHso;ZSwvUO|}ulJuEXze9$k?A||;7PcU3PPJ6xkdU+-D~&V>M%XUsxl$)=TlMd+^Q5yH z4&_cp_NPe9i}H-(rJ4)@mAleweCDHjsFhY1eF?rPh5P?5gWHQuQb@DQM#Sq!vQU?o zg~O}LM;oFm{?JGBVBirWQwgRtPdgPH2`_|(IYsf|9 ztW_v)W+CjsccNLcl^S;Ba?u-!)BHo7F)%|tM>Ug8$nBko3et!4U*1;-h=SAifC0VG zG#Y9ytyPX_G{hb{3?An+6W3Ez^J1lq_U@i?6)>>yU|!2aflqb{_%g(RO}>)-L5`^^ zY=R};6j5^ax{(l)q;hyr1JpNWhB!qReAg3@LE4bd_+*tS!FTZkKU%vX95)JYnq?Rv z2162y$E%;y-&ljD&1KxAB`3pyB`+ZVxNoPvA}84l>-_%F=b=5|4)TeHSZylF)N_42 z;p(81wC8M*ZCB~-pUA(lCx=6&x2;X_E$k;?wfr*n0eV3RA;Bq9qu14U_%H@+<79Nxc14+_IaG6a6qcy}hC%V2Hqhfk)~uM-0tsi6ji zOQ7mwNfr+kRu9pOr#u%+BaVF#hmlG$4jfcMsupNR|MR%TWFjD=RqW@+_|I|V`;tVO zJH`Yh1lOh%jmDEw!Er93=Q<-sCMAcu@XUBssOA{^jz>?Vhe_bak00F8625fBJ9xz8 z8A`)BwS!n9rK0Q1N@Afk@-|dBq9F2ayf09Wic6jm5xI;;iZYX;{wh1tm$j?+wFR!EFu}XKn zvR|^W32~%4dM{WztP1rqP<$*JqiV@gtI}BR{wDx@Y=oztRfGQ5$5zaXj_!*pM&oe! zi-><@jrwlO1W(TIw&ZG_Pft~^_s>5-wol7GU3rEN3z(NQXHd+(RVh3Xm1zg^a)HIr zg#~QFqkF-TMhqz&GZ^jY7m&Lk^>LD%g*BrrV>>-%iXbIUNa6X16xz$S+Ks*$`g~Ue z^9j*3^S+mm-xaH}Cg~uQl@4do!Y`5l?WJdwF@V?wj2^U0Wj@<(u5K=nF`aIi9$Z@^h=s9)~PbmC0MWt79ecVPj34dVNjPqn~C9cWd3I~g_M&m zTDLl^rpl`(T!nGtfh$xMyGm!PRrntISD<6`vu7?<8fncCJp}8UrcssZ00`hbk8ST} z??10Ym80cW05ECav|XuQTQU{DLBM!Vsm?9azcscj`{eIm6Ji2DwJX)Rxb@J>o{5G# zRX%qdk*$@4MMtcXf@Qr$eHMdEDKDEfYDQ2{DU|A+s@o_Q04kc*E#z?*6aa5bE(xO$ z|9kM8K?)PL7{#8Xt?Z-l+v93br;ai$YYY*yqaJ3@bZ}iQ6RXl;z>x63l>Q;dwZHl~ z?{CcgKK$B#>EKsrJ0kLN1i3%IsLm3>aw3c=_rJpiyC0_nGBVG?|N zi$8&_yIJ?WPTI=ypMfht`)+EAKnELC6(M}(_|6cm0buF<%mT2fep$V9bcA^+71DU5 z@I_Afr@{SvS|^!5J~q+Gt85K;CD3|>q6~o#5EC&DogZvwI@0`Z+}ug`vbG2Gm1*Bn zaF9p2F@Z(^y1Tl%mUrjB)a)fqr1WFqbWx<$SJE@-;f75PJG47 zRKPBk9ZPfxX3V_|hP&kSe4N45{k84mAJ%Budf)tdZFtT=@yPfJtdYs_0Y~UhBO)*4 z!VfYO+v}>C0ax(6&2OvmSLxlikV@&X*ZZq8)7vBR?#GVqXbuQb^ygB}g-pV$?4W(x z(L`FQCqL%+Q$8Z2RM?14m>rQBM4V_?JB;(QHvNj_ z;ianv;V14!qfPlhpV$jG$&68qa#J%2V@|T!kC-dEs~a12ib=GjBK|qO^SfiE`-1gt zk;ff5K1ZlZdEiLv%#1L(jroxog0zklP%Ve-eFq_M&1bf8zlTqv)ANJy(jk7|O4 z@0cym_Y%zEvtho|HUPLZnTEbayFW8e<@toon2iH|fbv$Q^JzGEU~CM{@Z~anWqsX3 z;H3B?$z$gSjdEs>@1;25&*V|8Y7KUae42vb6SS===Bs51OdfO-Hwj~*T<$!td0TTl zsm-0>+MRzD_GJd|R+*C?di?WQrzkyj?DHsPJo5>l;By(q7_%M+oAb_J3ap8Y9wAS&tz zQVWi6mHJtG)j@o^Rj`avF*wlJ!8SE2-mnMF6A)>WEY;I5o771Q{rG^WhS_1jz^~Zn z6lTBLw5mp0&VCc-YT!_zE*?#7qI2?4dc0J-AMN0O0wQ`EU>BX0}8avj_uxs3QzEboUhi62FyqqyZ>dy(a%yup(NQ#PGJ z6;@#XXOd&3NFIjPFKPm$*N2!g01MgJ*fuzqo;U2OuS7~1T5oX_QbF$dfnY@G!TIHdmMxjxw>GH@E7R=Za0 z-1E0Lg2jh_dN+rGUS z8w7Zr31Vkz*gKbgF1uN`lRD@n(t4^A6 zW)Uq91qDTVM>n*Nl`M`|kwyo)iVtoP|1S-__wbOZ#h%Ada(8`_I~DTnYn728U;k!; zN5_Ooy%F}nQ)>79?I!MFuBPm!xAXtJjslBEFqk zSzomj%CB#1=~aFjSH_VM>^IK$ZWPP2U>$Y^Fp2=@zSCQWBzn%gNhi{1uQt(_ImdcW z)AT_XxkjCRlagt$qUXiuY|Re2^3J&ZxciD*;qYT0JNWwW^nCA1g8SsuRJ|?!tbnPX zXZBUJ=}oI+y`O7*yoh%MmW`*GH*Z7gRovO*xFxo2r+wBniSuhvZnmc!XThAxJ^AC~ zqwmwjaLzRcfNSS|eM|`2?GQ){K6{i?UZqgwBD2ZP{ss09H70sGa(t5a;J;b<^JnLL z1vi8~5k_oetea#}JW(tYf8ZwcbfWB+Y6t`)rqVXvbG&xu4=Siy%%Lg|(@YMz+DTY; z=>d}Ng}e0Ke@BXYy}xqM&_LZw$6VPTV9t*A_V(^d3vz1zt+r%NSj_u&kB_1R6@cEz zYKcmGo4xV=9BMZ?ALk%IT10##@L5>6Y}Mgn>gBq%$IZHR@ebkaw2MH&LDxoP`PeN( z%5@=h5Y4Qf6eIlL~Pz~vj zpkUp)E%}x)ZWU<$4icq0Z7XBp!G>D`^=6Y-r1IZK7L#AN-pR=Pui>yQ7NS)* z<+ZpYzEja}vdAovy;PvV zCxK+)%AlThezdBQ@w88FoI|IU=(pxSw6m{QP%DcLVO$#JiIwgQhW~B2y+OcP8*pr) zQsUyxUHr>u`{?t-@vN@P4`Ho3$x84m|LyrR^DIaQ-Vtl<(?p^lq`;lW*jHiNHX=ED z{6odDwP$*z(=UD#BOE$WYbc#GW&Y13N8T(>|$#H>VQz@>dw>XwI@s zVz)T4tL6FpdH>&Cj1%!pzS7E1XN1+dik8)!e8bDd&M6+!ctI$1VC8~Kn;>hOGcyh~ z4PAEvdD8`g^{$|w8e^Ijp&_UGBmdzwA8Ihlsyo!(SHaPbtkpoO5ksNSZh8jfHoVmo zpmLD3QC2t17)Mk4$JP{7@ax|L0;xFIO{T zLx|vtbI*;qz#In#!pdem*Q~pH*octV-Coeu zCAAa_y`2>91IbFYY#|8U`Qvk|WYJ`l`SGgC;7A;qwKb&cvZvEA)L}@=iA$y>hgvgD zsQsBQaPwxe0xe|4TOS%R`}SUuHE@>cRH(Sy*tzjR(xOOfkCO!CM*Dsu^4K(Ijh$&r zX%0CnG|miFFVk)Y*-U5!)V3A*S`Ugn?5&?Q%8sd4GSE$H9aMOnhFVb0He_^qWH(qv zxtvJt9R2Xl1+(!cFefRUKU|H10MbAGm0E`cXIzGLa{tdCJ1#>dE6?A5fc~TZobim8 zY?^!sAURZ_%u2PE0cH^kS}o$<(fdpxO7uvOGKa6$%@Mee1_fif&^bi}w^)$!NIwxo zntm?nQR|Whsi0y!9y|rvT`-t$V0BZ2=DII>FXN|In)75%oV(?kmk3M#AZ0g8Q@QXp z0DFg6e){G6l+wFPH@6v~TP^Kpnrohfg`~Cp?W=R|bj5;=UL10%6TFG742I;bVI7pr zIMhr==Za21+UXl#dpzeLcTiVCoN*)aB)@T5dsT z+ZpVATgx7|yllPokzk)A{%&U!_k-cDo)&upawc-q#uY@P#*U$tL8-QcR?_Shv$2ha zshhtaPNkD!jjlx%vlRsYd407pgS}C1byj%CHt|#7lj-sq&oQQ;*JVo7K2QF*)lcDG zlfs+WvQZ<>FTSnX&hz62WSfu6L_alhi?`E%*#BjsQ_iC{Q|dUnygU!#=zcV1EzWso zcn`KF_`>gE_j!M(VQQCq%cQHvMFIb7mPJNbfsW(%lU@AUIzWhJ1seMi!>SP#4dAw| zt9m*4#w0@c@ctII#ib=6H$Kspvua_siBdOqsOEU~(9P@N4pk>7Wr)bXxz9;J z{m{a?ul8x^_Hh2wop;|-*8|j|?b~rCpncz>RbywV7s?#2;68d!C?ArtV=Y&MT2jN6 z6$9YTQ<{2RDT5~B)%wHE>K5U~HmrS2agMIe>%+H|lrB$EFfVS}s9^3#2^6tzIEUvy zOH0cg=;ZFM`HBJ_;(6Z>BVY$1i=`UnoZwxIiVc85tL)l*f;fh*xj=WHnH!7 zIX>mTlBHR2XRuzVhBwwt`U=Yo-P?HHT5Dw;54H#d<1Z14u-r+9ew2io{M zD0jWY->)6{%*Z~NZF!6=T}EC`=~7f>;_Kwpb9a|RsnvHOAP-~gaSV7|H8&b}X)9^0 zmnI4WWltpiVJ)RKz}5%{k|F)O)jb6AU|wKpY1HVIoPNT0tn_MqGbx)ZNN>8%So$Z^ zIZ}@yM3Q7Ex?+`#sWu0wGrE3KE4*@pdK?7^;jb@%1@@o8N~#E5wHi6h`qi&Hh+@J=EiLcI@|%5+Fm ztSpRc)lVAB=9tpc(@Dw5oLyX0D?fmzfG}dN{HmE*&X~(U_68QTF8w50bA?@(Hpw~A z-jyJS!7m^nx6>_{DUbqwJ9?#uofN9nfI&5SckTH4W;VhcvoNa2n1&QvS*U66Eo*bI(K}1PTC57DWa9;e@~Ze z+ms3!zNn{uZvC3k{>`J)N*^BI2~|OoC_;60mumk{G^*xoZliDEH5wbQ=jYW#u`5meB+|nQlfSv~aAy73rk?ph%AmqJ3xoYJCcL;I zx*j7~Dqvu@K$)nN6zmr_?fzH9tLNc{K6x~R5+%Z2c01!`1v+Z%R)sH_WGwihSq`5^ zLIpi3z=8_9M?qZt`pHTW1s1WO#^llw=A;yuyrtp6aPmmqzr;03#+XdiJS=XbkP(zidn5`WZ?NT-Z z^h>be%6PV<%8(VPXzp-B;KOM%d4IjCy{J-NdFe-2pka`8Z(diC71rCL*V5_%!GYw+ zDJ8_#r2c7Iu~T(t9^XS3%4LUwWUNpdohmB(t|w0`jdt?? zLmvyUy=+#hWn>)82_O@Ns$Hv`po<*);}_)wfrK^gqVn_EWqhw{pV`W;P{TAfVV*1* z-l0yY3x9CMKuu|DL^k$lF(`T}o|MO-mZlE1iY11LKAlm_E)F&|wS@ z%lJBZP41<&PXTYbJ^b#wo(V1}*-3cg5&kM{Fvt+s%k3uYSu8WC+U0!3DXA;Hg3ka^ zO^Q-hQj#-l7l;$|cb6RWkasYo5@U%Qv@*Y6KLzB$^yU#>%|%LS?bC8ozjj?9Ef3=a z0ZYIiSRuPag5>d$MG?)_io(!~AUk5`*GYRmN4qU3d8(YbIcPH_;?VsQBm5Ry+|ME% zX1-EdW-W(>D3B(Fhq!CYs=5PgnWGIcD`r8aIvMSgb}f{!k|<35K}Hm+1Rd$T%4hey zeRKbCV2-w~`CUYpI zA^y)NUMZQpeYEeC5_{tARXN+%owokPIFY%iiB(&++hEKD~$%6Pe??c9?LlG5elI3bIy;Xkcjt6P7 zyTXE)5X&4kwQN}SwJL7NSk5KT-ZOz*5TT@rl3d&!|HWT|wHo*fh5EN7s7fVe>SDxg zatXL$Z33TU4utp}*3_LN9zCtp)!)t7%x5SKE2O`z_D0W?^Kkr|9_=s(f*yBrYzcg* zA75TsHoF?)b0*qcs8s)IPZFnG`OQ)gxGs(#GsI1WwBE{WAErcY&zySPKg0*Thu=bq zh$O6jcFEMPZ5GG-kMv4)lU9W|P&LI^wGDvmSrzNL76;w+)5HeOx;vs11d)?o2I-(F zSS4Hwnz5S~#QCIM1*(qIhwho|d%$|?3UwK><16j40Ezs03d7s!?XEo5M7&8NqV+Z3F8K3W&wx>bfh z2rTr$audU@EdR3XFBuDgY4ooLN@GZD?E3|#{koQx7NIZ4D6pPezdSP1AMLjIRYIh( z2Q9yUxOd1Zx|_#YbA4rxXjHGD*0lH;_ILWY#?{RY$gZJ}paG6axSv~~#qo)~o8V`# z=JvjcSlai#wvG;YQt2^rxaXn6jW)6?eX`DB%#ULsY8ZsNvM#GhZuL zT68I87Y?2{XS39h#hAtjDGQ{Wo3FL9S-SN+LhB?okIpy5=Y7^S#?_;$_)l?4c<`R3 zC#=X;RYX>+H97yDXvs0)*)mjh8>~YArqdw4_N2Y3N@MFhX2wgpT!oGx!M6RftsB{k zF+BaaLqvzV3xbo{(U)}dUjb_KEyM)P{@guKmQMLw>OM+lwL>&>h{^7Cq@=|6od1|0 zp#!tAs<iI)_x?UmQoMMkZw_C>*wi-KoX7;q9%q~uM;shXqck;D zF>g~~4feVF^0}<6UehrNW%PW9bg89YvkYUxBAHWN9U;@)_b!-%Gdt#P(z7dget~GK z^`l;1PU3!DYjt=?g>v8SOhCotHkY=2KNCo$P z{bYs1+P`zN_GxTUHoP&~H4p4PUj50_>lpZ-e>!_}eLNuzDaq-zL{nvS?z9RfVf*DJ z){`?;Jj{=+_hadQuV!Q@xO653JAMYLWA8x9{`{__(GSd`6nt(-jP<8V-^^s{+ zIj6qajt63V!xAK-kF({9XE<4F(;!%(g#f#17Ah&AFUqcO?5Mi5v?uH~C||WvsqmtO zl>EBTOFuLL6cWb5`Kdm=eWz`lmrb9w?v;?`y=}>`1flH%oPNmZrX?2V_wQO)mVfUY z97IIz&m1+qP0jsd!+Q=6U$N^0?h}=!p4(HL!uLU<&|8hlpJiEIKoh#PH_0#;{;=d& zh=74=b-Qe4>TIi29qlBKY9iJy74L0jG=kJG4&1c{(xop*wFlt$T2e+I!X>1jI*KNZ z_aQSoG51zMF>@~5_8^jjwlGl!d8C$N!@^ESgPQnXOC5#$r&Tra-Qx12YLCt4JMPPm z56{e{!dL>1bWsoy5GYtZb4bafh*T-L8n&Io>0OtpvlFel)eYU< z${lMKAd(p;UqD@#s}#-{wG4;v=X$Oe0=r!8?+w6s3WLdi`0&AsFB{ks2JcCf1) z`(ohvX#3$H#yvP_3%tsq^*L@M7yi2F-33qw8wMl@nu7zBv`y zqh33qjH&yfdN^V*LF8KI)rh$6b2>?$p*~%0CTqI9@a=uae3p=Pmaz^2Y$hc=A8g4< z#F;+@OR4WmrN@v!4i0C?uu7g72qTdjYweZ2!$Dao!EP)704c?cV;%xoW*MP0-_ zL-&p2$o8A=vM+mcb85hMtp!Ll^_!ZrgySF}!2@6g;m-@YLoVgBN(l2dR zxw;~!KTH@{XkW?_iXl*Q!!sdw-&&o$7XpURtz{5KG01r0DhKH7+hz30rkBobNwfbX6VhKi|RQlggCGFc@G7HS^1 zx7sl>q@6+=x$n+q1E2~PD2qV0kn=Wje7=aet$pyE7Dp<2L&%Zt$2rf#e8cagXo_lY zkK$y)b~cjt?S6P>Dq4o@jMJ+Dt%4OPCpGTVeIca1X2O;}rnwYg==h_ID=CeJTMUfp z8=}j5V{u;ekxM$21a94(U#pdMogKYDMG9vA77z=mWI6eJOs?h!gwHkd;Pag=6RC3M zO)RghTg+2nu@hiC_@&BeRdJDg(9nveh4C;~BU6a@^#!+5aQ-^k{`oq`lvDSa(OLB?~_q)T1EDYHI z((u*@T5oUfCq4bM#WswkXkOL~;zy}Pm-+U4V~p{Pbm-g5ocV}cJpmT}%{ea{Nl|A-$47`HwKooV`#?ZO-uA}w2j?6t_OyerZw^G-EwS@R zHK$mTR4wM4TFm3=T*f&j*&m{fAk_x_K-ikJn*X(7K>DGVIJ?5S&oR&_x#q%f(9Ygc zjkO+iHfP5-Qly=kQHHu8ooduYnH~fjn6+A&O2Y%r5!>G#3aGH@4 z`pi}WB2$Q6%oAO&bKEsp-O2jvYVsrql55s8w#JK&h0-jO(GfZVAGB(lkF@3|mCA`bWy!S^-{yC4gXRaQ;(vG$ttM*(U{srn*_1@g@QTV+gAU6_6&i^FE zbjso_!3u$nZO%~PYsDh%B-u2IwJz@LY|zcv{qMD^gdiKswpkTo>NiV^?z-*g~W}URXOkO`O+Bnikj2xuY8kZu65wNcm zUOj;f_(@j{@2LSer>B){7QBsac=sP6Az{;MRFIR4n_kf-CWQzPFfa?Yd|hM%5AU9D z(8>1t3YGqL*lK6ruT6Pk(Z3kejb#?YGts7x)l3FOEWoSgKU%+PrwzVL*#FKYNi(kewdaALICWUvOl0tZSl?jlPB>N$NndU#n2H<1 z8A=&TO&|O=dNhPH<|p`*j7%MX3{ZiBc1fpdjf!~4mFx7-&Vlpq$^XEm`4zdDW;E9{>iM&$_DRXfXRXvDijcNn1h;2$bTSgk zHf?dg^s3=e(?I@PT>5m-K5)g#3S+@n9Q;>u{7^Za6*K(Y&`+06TR-5g!SKVHWWu6x zfCkT4C=^7a%Zj?sgF(BN z=RUuNWxMcRJJv@v`|1x@b=f*Tz0T3tt8gOeuAFw>3pfHCBcU1^4)IksMSk7d<&0iD zhyMk;;me;7Rn-R2>=@Dx$y_98JsfZBf^N~(&6qkQu8axxY?7(_R3qwc#~g^vU9rU- zjrg$T_|67{$w3Q|pD=)d4z#4LAe~SmP^M(=o+ctJ6r^2YJPR_v9byl&cfQ*S^jwFA zUn>!s(z&8Zt6k^VMW0S6V)Sop9J*eDC2WFdV-Blpojp9tj9yvySBe>$gzO0#1y!=9 z{{q^>bFMYbY^Qpo&Q(*-ePn3L^!ob7-2yiM%`L!B-nI9-VPD3tzfy&LVF_u33AQC9 zAe)KxNXu9&e_paIUfEpph?Oo4n^tT;{a}oz;>de{{!V0Pz0)TunJLwE*bKC_SN&D4 zU$6qSsi0!6{=-NZr0C-d}pBW>q6^oK$QQuyZ z1^BcDyMJyhbzfn_1H4AK6(Y+JFqXD4{kN;!nAxv(lcbA*q9gjQ{fZgSiXE2;i{L}; z(dEhoW=Km?Zm8I((N7azA~PMAK?c1U1#qn@N#@O?pD&!_y+-I4z(DuFWIkzTo|9c8 z3J9SzU69#etha$kQ`p+EJ91SW&7}>Q(M5U!V{dF)ySQ_&!11gT(*YNR0rjLl@RA?C z1jhH3%lPEbdt0Pq8?a^##}ZrZSf3Vwm|Tx!1nEwc1mob5MWu$~k=|o7FSPK0n!@+r9|-_;odg zhPRKDjNIf%2vR-tNb#9gP6DJqjmdkdp8LfPAqzkM&`mlcE>LSG$P$kmA(2krW{bz z6$8G;Z5hm!?&hhLT{`15Ba~Qk5?sao@p7KYa0H=KkHfw{ryhb{4>9Y%g(yUPM>6fX zbrC_o*&d$J^T;_O8e`--#d08vdhh3wh|>BoKQL&IM&x&RM!(cek&dd%G1o+&ef8>! z-W32e0Hnk8@@i&zz-}06{T)F-374cRK209@sQ7RhtEe73BIK(>(y80|8g|G*O?B<` zL<(mNO8*-wrf(l%H<^p%py1Uk0*S7i+qcb zTJeP8RL{}!N6jQz$U13TS(;3aA3qEqi05KNJ-5tuWbfQpX8f34!Rzh#R#Vke0ED}` zwCU-T=&%?nRG1Yxd$XnJz0=39zcnr3@aT}h8$z^}BxP<_ zFb>f8G8^T*bWY~GI>@I`x;aH>o%4PA@)&l1YXmr!x3Wd$ioT@< z(}Uck&UMVkDkO!L>~Y@lDD+EPX*qyGb>50oHs16Y2c%TtUcfs^m)a{%L1oXA8zERN=P)It- z&RqkOP_I)UlN-6;IhDq0@#6O?qf*fB&Y--m&({&gUIL-Q5!AkfiBo&}ZB*60yS!l| zfnIJ}220D6Q~0LK^#0B+fW}>>bJ=HGbi|sjJhcWK2bkhXqNJ>S5ot)^ew#^Y7G+tP z97zB1k7Hm24qpr3&t}i)#*4t~YPQLTbjfYh3+7CDevGWsmWBa-yFG3(WjZmO^s3-= z4#Ub_Z_=5Y%BH3E5S^e?A-jL`V!kV9jqaxJhMfhV?jfeSf4m;a4~@|NWA5a0JcI86 zOm2%gpqa2*Bnhe5ar8aDMX^9A8pMM0dwCO3^TrB9QYkGvW)roKR=1vA^`}edK7{1A zyJv5|(A91wXeZB;;=-?irge~#HnO~%Vt<9E6PQr`d-5fK0RZIlsN0ws-{6&BNuW8_ zv;zw|{cs(y(!u^`LxSX4AV$-*RAESFHw%f88fVbMC<_763wivETO_>lilzG@`ziaZ z^9^oVG5Xdn*4o<6o@TD6gToJQSKtybJrIgB-2~z|Y6@WhXI!U^C_3h}JPfjT(?3O8 zJ@u&AzWyaAn54;UFiLU#%$!vQ#NG(vth&#HYAU5(+q_rf*Jda5$}=qbWu3DnXi$O4 zK2O?ShRsF;GEOnIo53d$uSYm?PhBV?7HT;wER5l_a1PuSpoNARYLEv3SD-C#O5gUx z^Y84?Ga2l-=(8oyZz48&o$HDQ4ASUq(CT8}t1h@g5(|4|f_9szyz9$x_scD8=kC}L zDXGeugn*=;el&KeV`b|-(CqeYD?-hbZ}eV@Bs%{rw59OXRO9dKuj`Oy+)$sLy|oB>i;&@zp9g_d$&#~ zzx<;pShqFx`Vdxb#dYR?fzGK?@2^xm_IHl}l5`F*3V@(%s*3R4FK_>z$;l70(Ynq3 zzQUHrL+oYyP97dZE2Av_w_m#_E=JMmbqr<&>{jU~#7mY$vozfFIZiXmV8or?xel%J zScm|F3H)x*mmS;&Ms_CjR5>Xfl|ioCziXyh((0_?(PH_lt&XlPE`0#}3b3b{3e!BH zIPEp^cYp91uJ1@BiSX7b*pj{m=PVR{2JnL+L&0xNJX4Q&g%U0E7Z2PajryW~GDljgF#*89PCtfV6>8BCbY3 zuXXt1jkUqt0CVUi*T7s^Nrp1x~A%(&e{(@e>2WF@4X8ks9l#VkKNP z;=AasMN{otJ=b33`y)!HCTSz&i^p9hx}INT47YOdQ*$TW^7Bji=&YRO4^#m%`lorq zGv`t%Z@(q4XZbzBF!k*wM3*)f{Y5voHF^eB)oQ)MemdD;7qdn8T#!l}sp_02J7*H@ z1Scrg*F37=uU67NQ<-`4AgcHrmN<>P2`dw%jOXv^smsh6?jUygFaxU$ZV`wo&Lry^ z8OHf#mK=3|-%`B_-{MNJ<&>KwUO+@-f3mX`SPv}QG8z}ZZVyHi=H%uj*#c9m(^q#4 ziS4_cj9ULgm_W_&u9Ij0$l~=c*#`+_Un;7 zyw+gLo1Ndo5m>Ej_OYej7GI&?IGnory2w>66dBY4_}ZvR{r@K8+rQmXb$YWWj9+hG ztWd0nCMP~G{?<=3?(yZ`J-Lh7^zB>oxh0yU$55K8Q$$~KMoE*mnIOsaNQZmhQT31S zZ5E$#86wYR4`&BJ0Y=?l9DqY-)LZ^ zq6uXshA|Zn26aCLJh=`vt}`bH=oW^XQdgVIbq=cP zo0c!|+b!psQMVGJj?+n{^p^lq4U`R#tE%LIRRzT+Q$)k{zy02Q`~AL_Td{<_PCp#L zz?e1A=wt&pdpzt;7EF)fPka0UhhrBz?yf<{OS{k-EFGqV%il!I=;t&YMa?_A)1De{ zu*W8k-V4F9w+}4|S6PVl+3BRq@NiU@68>BFv3+;Py0JT#jyQ@|-!spv{n;X|>N&@u z{Xn%LMx0eb1}(OsuNJM&ST{r^#(}8d(5y|;Ft-%V%AheNn@5nyIM7XDL8U}c2QM+? zZF||p#XAa4ifdfVIr+@D%iYz-ZO5Bu73u zJ>|()5cu?o8iUX*YY1rBhGJnOy3XD z0$QGjYbg<%vJ~?~0^-h~KdNh8O&yipNB5!*axJv`&bUPT{$C4FFn3gk@*jYy0mG_S zRuuS$7x`lc|AC>bsQEN(QXO2d@%Ux%HXwG3Jc8^3`e=5(2G> zc1WzU43Ho3gaeIJ&R4r{BLXh7;SBi`l)9=F>h(v8E^C_}65Hke@O0T(JbivE-fSQc zF$52ou|s4l7LHId)v7hm{nDdqU1F1IjoV^m=ZKcB<+r0Xt28bJ-vxiWJea%I&_W8M zI&jlP6q6*CB5IH8%*u$`T5zahd{bD9!EKT{zW3hW%Ad&@Ol4p2C*UmCDMe>V3mO+Of0LU0F|Br-e2pO zN+qi*H@=V!K;2~;MBwkMhb$&dWfgCVz)E%Q_%SKbdV+6{g|ZOUmNKR+#-})(Fmh+i z^ZgBxltg@PLJT~E8?Q`n9M(l;7jktY2U_feY(Kke>d_ek{{P9p?|ltJe<_sXZlxkb z?0Z{f4V^y)z3kGd;;P$+dpA!Sac|wcD3av199hkw!0X$7o+J;+1)R2j5b?d^ns5kb z4G(zArkMTyDPce7eVUa6LVvtu3QK7{D{ue<5tiY7@gYhcuN`U+=9U{K!7sL zpq$57+&u(xuxKVU4maOI>h82K?aj8q!6qC<>;J#hdmn4e6K z88O!!;>#Wh{?`g#c zQHX4^oz9h_;TK+dH4<9_(uRk9(W|>X_xI3yLAIz~kvl^8-poaUn~>C=pk}p{qdsID z)V729+Qs4G?_ZI^#*0aX#K6D+sLiT%)#Tny7=cNRvWCXY7AWIzygPYGhYJmA|Fd~r zv;q;u50?fjbBPlqCdIjG=p8lF%SP@qdlmx3l~VZC{jV6GktIP5{Z>-g+aQet zsF=r%Uv~~-bn37fcj49}5ukPyU_ISso$KSZPXenwb!iZiA$}A0f$!Yv!!sdF@~svs z0u7WuE7=BLr6R`+@TE(!)3`a%_qtDaWn#OtLiE(;lN-M8iRcn&J$3wfi}r0qL!dlP z^haQH>PRLnI#3>?Yl(TOAjT~oI~awYQHyn;p(1(u-|o>(WtRaAIWY;Wzx!riu!25O zC&=`G^&x%!bN0R27?3z-Sw8$TZR)pfJZ%(l9K%6YTzR%aFcSaYKgPsB4Vx`S7|l?y zyockOIUjjr##Ca~(8gs@XGbflG{RmnYI{Xh0x>Z*D=-kalZ*I_tvYtc?)rdV?o0us zw3mD5sc33+lz{qjXQih<4%_VUtb5VS{Xa|AJclhf^1~iOv#^b%}YLRy7oc$;%zl%fEk%eAy^RU0Y@iJ^x5{bYe>79US-o=nQN~#Hy5k9=mEgP6N@t%8Y*p zJRHvc{*%9dXK{bhr}{o9)~?O!q~EHpn=+rMapCkU^{A(|z?KBCXiFzX1?MQBY-NC9 zGrYOF%~7_Ww8J8eweGWD5At0>F(c&?fR%5K*3-jrLqji*RCw32``?E)#O^I)9kiy3 zMVmSkvU%HuhGJXKjsoK4vfwge^BGNK1ZP2M=66)@;hr<@jVTrcQgl*AM`%dwLhAx? z^-{k6N!op%j}6P=T7?3GCjR!8(K>kNe|-%1s$19l8d(2_ zLxH`eN>$1ibu0z+Q;KuO8vxK*b`KY8ECw(+wDab-{uKrk7{Gg2ADM*>-K@V4O4Sj= z3$e7XuWB3eMSikXo8+-dNfG9uOCo( zEAkzEE=we746~HETjMkAghtCKQ#81H=8u{M?L&RHhX}+`f++W@;CGNB$_@F>JntAx z;h_Z@FkB|Vh;Q-SMuYzOtuDRS{@N5*Zit><-bJG!&{Q`}F?U>Z)jRweWYhQ-5@!u` zSF;Hx$QA2csDE#u4nw76z)W;==czZn~eeo_3U9XfeBQ-+ugP z3%)-$-2$2T`Q^H|%AN1fg+KFb<*DlC*pg8Ap1+MN4)WXxb+b7uzDID30n&R*)7_jaM+Q$xAPnWsy( zX8%{v=#tJsy5lCLyHgtJj-gvXx*1>u z1f-h*X^J~mhV9YZ(QZ8HSu zoI@a98|0?l``kathADG&f-TjcUnTYyY4`P}kXn`aO^}(vyeJW*wrf;24Y*x2wzbK# z^Dz$K@>aI|C6?xnd&3TwPO>0Ntb}BON*8QXBXAe|TS3~$`enElV)EU-7t*F1SA^%6 zpI_rD*R*f%eQgmtXazCBBSyhJi@QO(ul<|T=0ITU2y|-?u9lkJh9CL~YxNshEXY;f z{5MC!ge3n*LEJa9N?;eqRb?#s8 z{L`qEF4r)3F9Trs9%PI-hPi zPpt=RBsjOn?fd1Km}uF3Q}Ylmn036pd%T+R1E>;TkKkA!Pj}^~SnYDq?w=hsMAd^t zI>CdPX74(Y=JO5&6`%aH|M>JCn+MLLyD(6z{q2rYkLfdcVL=0cs#MOId-_QMH{}>Q zN^yz_0|SOs18(HTaBHD_S0Kn>}V{=;2|=k<-}*O_)Z{|G(jUeR0xQAHFPRIzHkRsqIqb7!|aGs>GKMU|dV z)|-~OLjaL!#3WP)nQ`LKPRit@?^82}FX^g~5)kB9;Dj+7(nY927dTGfB|^WZTy`>5 z;?ectJVEWMZevZDDK^@w(6XGI3be%ENt2a)$70Z>mf9xEmI#rv0ruj>Z&?>va?#Et zLs$#DP64o!ZH-q%)dMPH59l=1_y-kup&MWqwzzQboxmpXI#xNw;&5bc_lPA{4eJ)s zy;5n~YYw)+5k2(PHCpJJo%4o*0$nDO)}MMpwBHlIoDUeiOJxYg8^Ba4H3IXwK76_x z>I3PtRz@qi);UO8s8Uxr+w#v92*b(M_qa6-T*3Eofuts-1}+U~NCF53I2;b7HY{1M zQ4;lN(2*R+2Du#t`eOgb0sw=>o(lQgnFBI-vz>s0v6)bivnGu+69UlK%-onBUC4FZhxU+?Jo0v+BRuzP2TD9^ARJ4|OJsu^JHE z5Vew^NVOszuAjW?BGquY^-Cj$hTJPiR_N4T^(j!5*pW#-EKm9RzEG0lt#RM|-3S@o z+A5xX=L02g=@JWiR(<`hm38bo_Oz%z;yiKU7WNWUSI4R1tUpn6alR#Plje8m3m^|t zW$rc#r4F7GKWDLY5&Vfe)Sv{NimiW?FprIWD)EqTS2FEXQrfX^{@A%A$+2czf#f@+ zEYPSS=^@~Kno#tx3$>~YP$|~DrHx%0I+-#~xzO~Kjtn31tsYV`naln|p;xN=nZog0 z?31u?^lO+{?|6tR+yaoPjU>CE1$S__YY29E-pKATBu{8p)6p5Ls(rkX44Qx6}=nHib1( zp7pf77pj1H&U7XkP#vIF{wJDi;hQ*VbA`=pXo^y2TkUOP3q;4W+0h}lDX z!@7lx&M+D1+BFM-KHDLurgAch=KAU4d~{S3V&&O@w#g_!Vuu5i)qaB8z8l~ZC*H*x zf%^3qo+p;9v#LFUsOC`Ezud4(mVj!hX>)gKnH%%(s+3JY{wwOpL>$tnI*tAvTYX3< zCvB!))`3R6^>TJ*pL@^d-^P?Psb#nLlL;? zl_^PA&iuKrA+{?1&3AHg+R)xUwy=;qV%0yn^=hugwN1XHS+9QiEnDL0#y;>^-`nk85V7{X+ zA(rnpuJqY;f6@0>@h_{>B%iMhV1q@sw$hlCW8U8tL>J(1V0>r+oOFtOi#7cD&RHW? znx_z6`kDzcmbU{~}o zyfp&nf3x+~FB;UsJ9mJ2q<<$%Un+YX4`zb>!T>kBuK5>d$b2pqXn;N~j5%i1nR_h# zQiT>R_3d1v2PED7bE9Xte{-Lwki0Bfm$odzA_RWojh3eG<(3m0&JEV8wE|^O0JC2u zNIIu5awMZk^g%`Ow5bla_I~-e1jbuE1wmfkly7O?0kFv8SPI5p-3P@qO4I!K*4ou~ zK}Q>p`@((tBftN4E4tSxe#`wR2td9S)WrG4vyVqzB|lKD?8v%I-nQ#d`S|4Kq|@^b zNKJY5h;-R$q<>m*C{_t&)B<^`4p5Kqf=p7%+e2|!7%tVa43b3w1;RwczcEr2>FW1S z7QD216Ta7jpNo`Cdn7CyA)65FwcvNK*`IYwkAFXfl&B*0@g0Zx~ltEcNviyjMg z7xzGS>E?w$Tow4nT9yrS`^{!pXjs;n|BXga1)iY|bD3=kiuEUK!tU4G8+*`+$kGrz zN$Y+Jk(`}GXCdcrbI?VuMP?ftQ~}m0J8|d$QnXx+2Y7uUm(u~~2Q+arZzn+9UKvtu zE@xj{DO}zC&6?=XpQIjM0exwpQ{2UQ=HSFoCoBo7&@V&=Nh|R=s zau^kr+12`!NvhRQ$Y1CSVd3N7jf=@N7q`Hh*lM%gE%Og{R{9m8g`X`v155xm``W+f z@w*a>8yg`#YZ27dtBqa7+V!Urn(eE%2&^_sOA&z@VB$?t4G0AYc7!-z#w73QCa3mW zL`=F3Gwv-W9eoq3a!|D@m+f|hIj5%9&wXCzHilZA-r`{qs_j1Xy3YxChEZ!P*$aP5 zjl#_|&n#3K%zd*WKscqrm|cNHy-nZGJ%4ZHdQg@gVgBVTKq!$`$VY@ib%pao86cQ4 z&(?)$bGh4H}k^#1zj*amF%5ts3(4Kk?VTX8nV%PB*w zmlAmm7c`4i1NoF#b*|c$9Y=LyaF7PtP=PBtxS9mjQ-)e;rUg?`YV0!1S0=3Yup{>L zNPZi+DDai@0hiqG74WT3uKJUJY&*%j$Zj-dzYh?jM7U-qumt-gH`f*%-2R3w(F4KL zAyqK(_!8OgN-$nvtw=|+fXt|C;2F2EjN*bh&>=U-@+-SNq%N7gy`-)yu{ec2OGvYI zH$gXJ#&zWR^vfrSd%gm(dmM@p#Lmv_IFBMekj{WK9ANp|9#{#Fwi-{8CRN&#iW@XS zCVgLW&4$~Y>ZZ8n-^sVTBKU8h4|%(EN4pDz28`eMKRo7s3KRuNRB~C=PE5IIx(^J4Gqa##g^T=7tRFpfrCIs6VL#CaU!;K<_F4wb_-OMN9fw~M z#>x;3j}|kvXLLc>@2-fm9tT3M(Uh{A=Cq~O_A4vdqtjB=H;%l&fkg5W>hE1bZYAZd zcxp2Z13;HgCT_ui(G_5-b9!jX>3x5n@**uIOj9F!#v!R4DIC8tpP=}LGqs;Nyt3}(|#x@Kzfg?@p9x0zQ z-{wW@0MWHMw}-f4h-YZhHqjQAE`=TX2^x3?wD#bCh|P zrDx+zWL}eJ43F`udbW_00PfkH9m`)u272g`uxG(%f#$(_3U&CY@+MSI>x#?vH!?J;CpWTZO~}23XNZ z&EDrEFzF|PaTEgYx3l~Du%(FpoKE1zQE&hA9P({L0S|j(2{3W_ZK7vZ$+a3(>S`1# zMpF7nkf%k&Qd258BrDzb53qc^VO>K96ecZ++l=p9DM<_%cH0N!JI;SXgkE(4(l@F;~g& z=@AEkQ*tqwY*X<2;ylV4AgMWOnW$wkZfyK&Q+2=ui~g(Z+;`0v(ZVUT0i59~S1*2) zs%C@epBkf#`i+KMwgM|b3VPS)h`gU4yjeiIy?JgZ>+DqCz^5z_*@CBc#18R6I9>GRGUAt6~%gg z2P(}OPfDc<4ZRxVT`Ky8xoVvxlygcsw3EMWq z$D`&c?&*$>j#n(CYD1o)CXe=nc7T8)SxJgS&X+JN?h1pkl;=z$cszFwpM0!Dx3Q=!r{S2 z$Awy5agomRKwh$|%`KW%d_?s)u&J%;7)-?$w-`*uKMiAL=;VC@EUr zNkJ4~IPfeUa@ow~=O=95t)?^=e_Ax`+gm1Vo5sMB=s>3xYD3!H4Y}l!xQ~B1Bj&nK zD-7v_-M@!zZ#-R+*4GdH)R1qUqgj!Ci(shPP36vGB?T5Inc#9$pt@pP)gAQhqNiTm zrqOuTx!vz>^L2&YtX&l*HaOZApW5R{sYh4J%08M&lixs2xXQoPaH|7b3DUIgxa5cg zXttzC=72dLkD)TaO_Bc17zs0B$&FE~9PkAVdIW8AYyLbDYjNl_&io4r`(V4`O)6+W zKSa2(AvDAs;U6e&RVfK*{slsj9964mK&|+B2~5`5Uvu7YcbRYAOK6a1T%aZHaObPd zn8N&M&I%r3iP?dcf-gGdLr&JidKjZd!@A-+_%$857O z-rCYt6#LkI{ndTv;h6NLoN?q+zdZ%KA_QZUd9e}Sc1P@Zk{zkdJ#=sf-3`B>_bG58 zLv`%MhS8kdGA_HuEO7MiF*$y|(8_-~l!*JVDcED`)4-b&W($#m^PaPyPks%%uXi)8 z8;$GlhuV8bF2?lA>_%-t+bbK7HcH>}!F$K#*h1pa|9Eqo+S?Us*5%%)C7Bi5v97zi zgcM%5hV2NAXYrMpUncbi4rDAyq7wIt;j?~XIrcZZig^w&fYZNy( z*wYMw7lXuQhC|R>N%kyVMRD^=^#`q z_$aBc?hefLMZl#y*(AD~tm#;Ngf;_KcY{WT6S2mWi+ zPe;L*(=b%9k7l;iU}Y^!Zx4L@lKN;YYf@o1YQ@X4>nu0J_G@&M>Kw(gV~enQ|MLT( zOUJR1v_rZVC0OwsnE zRk3H2$X{miDLm6WWxQ$`uOP+hhB+zdY0C>dt(mF(#s5BAI)x<4i!rW(S%=onkQdb9rp}IzA`O?ORmWdV@o881 zlsyjsf^X*9(X7ycMq-kbJy`)zseuv0SMv6hP|ryhbOLebC*pVgR>bze?Pw zJ;8>|N>kIN{cbz1auw?H(^G^2oo+lmT$7#iG9K%zhiE(EPr2#GfBr6rp_mSBWcT|bu;%@a>r7sCtUnzf06HkK z0KlI9cLa%Mt!o5!t9+Wg$H#KbLHC-Df~nnI;gFM+v)L+oG2inT`O;#|ao~Pr3BWW! z>9RG6E}b3*gOWN5V`MJ3q@GTxx*IrijI<6hZO@;~I{+AYqzDA8ZAimrHRem-}NZx%TW2?u;GG zs-o00?eb!oYO)kCL3JJf8GW1wj5&I#yAu#Db_y@7+2|W=4iU*#LKZS%Lbb$rI8=AwL48MN= z<}KU$DVPZ9)q&}IxLeKyT|o~en<$qGujoq{^JoKkT7k{^#X4uSLUi`*=G`Dqf_=su zLIvCV7EQXG_x?8InZ?TKI6P4A^`kV`y-`3sDe_bQM9%` zBJ4yM>ksEa4e1Cq@`#@Xv083u?$q>3cs4sqRjv7|jE-Sg!8IcrFgj%+)_)jX$s7SJoM7#c*GVVJPj8PAK*1+RVsbV!@rLmEbrwj+Fq0*rk4i% zgG){ecllI-iVGf%Yh-GasRcl-wbR^a5Wx<}T11DUx0uidDK6DE(2JjaWYG??9l*aW zG~jl^OTKy?m@3BJBg8bH$X&kd_@4+-&3&p);^k2nU|FivtV*Y_&a@u45tRKS4L44H znc>Hr`!Uv6Tyo$f+VNH+2IR#)@UziLGleI2N?X$yf;Wa)ER}l3M*%Mf#_xlkz$t(l zoYMa0+qRzTiRT*inCx=ZL01$GX;*MG{_sgyQxB82$#Ul7_}kqZ$Kc)D_Tj~n%PiAS z!%UCIh?1XcBe?6F!9`u7trBBYd_I9QZL05MAJ#J#);JP(4_FzHidPG98SV`Pv2+@E z6Bhm=2S1_8#uDI}%#FzEjs`@$a+irXiP8zGwUv~X?l!D4Dd zLaQHKgT2(6;r(7griH!oR;1x;6pz&kwWgnW@*9^OeJ}goeJA2erAKC2qQG=V2_CoN z8MtEAkD55l)dK81U&CYKt~@g5kfZjw$&!{gmUpKlpM+uPSgKAF|9$@9Na!Y##H0E~ zw*R*G0+mKu}#}_S^k2#c@`k;MA=SbDIPHAj{QY zDtvhO_!#(#up9Yvne{I>pMf!rn&0CckC{Y>8p%6=v1~vWz^sq9qGbT{PJWsKeiSlO zlE+dV6&r_*`s}X`Kt{4|@s=y`St?#q(w1UmTRJsX2OYtYg%Tkn7VcotSxRWAOh54ozce310|dQw87A+$Lc+T8Ew8E2{Q`Bzj2HlEMF^q3M>IsE!w=IRVgKKN-Y#oUI|6OOIoGRfH4%NnL&^`S+?+G^JFW2kpFb=48~H&S zW=N*#ag!|Y(Uae-^Z-5f`vF%`;C@!ByX`Lgb0$ZePluu=RiKDGpMKct2R+SbB{9meqoh+ z{POw$QUX=P!UWS9av7MJ()Gt&SOL>VU5sa0-rNNJ+RXS$Hp2w$UbEpAN0b2Q_eJGc z{@jTMOnj3AV>L!V!ESW*V|oTFZrNhezPYc7<1sco3QVrxm>N?v!w}pf)nMG1&G8M6 z=)OI*wALV;^0l`8YX~lo2pXCyq_osYH++Q_9yR3OQ=xHkDd?e>xg4mLM?YSnRYF~~ zY&*Sj*lf({p#~3=Z?9c%P<0RT8hk#b>~oJayUj`9Vp)0}<Z0~*ARn_>#E!EvKDfaCnwXUe-rI>2}p zNRA@=8zs%~@+&_|zxiKdAFXyP{EzZm|yq zzIa!&5uD{c(Z`SVyOu}|8@2o46sUX93f$0(Las}2G8ELxW|S&J|2oAhHpMYAA~$YT zT=Gq~hQR`YE|sYuq@O95S$3Du#%gMtT@h*h8@R|3y2@F9EI#WQ-<2}=Um62!DE-wk z=2UI^a0@#|4jSHD#6*;~l_JF5ni1G5rIFSx88@mC>)jbnjEjozg_3VacQp{73K50;$yisGZJ!P z{V&WtV6xX8cKN?d(VC4YUs*>Ll84sgs6};6Be6+J(OJo?%ZKRp+pjD28mQMp#J4KV z+5hn=2m)!;k9>~&lo;0D>S8j;1cV=Fv7Q*mq{u^2x|2m z?t$_oQym=c-xGBbke!&I$|tb3w^$;CE@Qm0ZyG{8=aoI4UcbCM2%KWxfWSNV&HG{< zAxT1``s{lE;_-%6jS#v${Y`K>Ql2$~f6j`xZ|(5HrBH%N$%5>fwY~xgi(x`pkWV7e zCkbfYx)@B|@Vli1dLih+_jfx)^_Sn#f%o_OLWwe^rh2Sjsi~C(T12r}7s%4K zV*393;mTWL>cXrM=<>z+=zrbDSKEUaHs<42Aa-Hr1^;|k{L9OKsabFt-pz)Ey$g-p zvm3178!@Y9;7tBThH>|Ee}iZ6xnA#>c?}pxjv9RPFW@eNY-(!q&>LcP@VK1?ljfs` zU9H{va@$`1>HCr|6?Yc=$RCxpZ>%clDBv)=%HDFS=i6ko^C9W%YSKKKJ&xOxn__og z|2ojV)$kB+%~605r`X}GLwQVk_^)iWvaHVz73(Q<8jitd*x}=$*t!>H&?yC)5ZB^ z6rs<7D_kWUOAGojem_{V5DR2zV>8AVsV8Q6|A)n-CoZp;Bf9D=AJ3y-HWiRfN`>y* z`{Ga1VAS?RT!FbVm3D@Qo8J*A*1jq8E`%xl4Hq}y*W}geWUlCep+kjch=4_ zi)xv$^(9<-+1}r=Su6Pm8>K)oRvpv2#$cg!#TbNsZ{=?HovV!LE9$ZqZ)vIQK%m`W zo9y-*63AN_K@Yr&&_=ZE{GP3&$9Q%X;jWM}-VfUmJ862~!wGx$wcLV0RWy9amv_M# zPfv9IPei%@g_ka8w@nP*3kO6$1Okq6G5@7Gj5i7ys?!i12}+Ohf|SsvudnkZ8rSgO(fXTk|j0 zkb^EIvS{`_z8mZty9J~8C`(VRVTbv1V`6Z#f%BfPX@XbL@f`6OVFf{%@L|WCy@$8| z=$Igreg-QA*tEaJ^hfQ3{@Xo*P$e_MzFjOXp+11Kf? z1UQWK=#+Sy=*t)Ew}h}W%caAN+m+i_m@s!{PtmI8ej&e*p(v5D5hhyi?leoKUmakA znPQO0hvm}*JIPMGq1x&M0V3eJ(I-=qDD7M?_LcrtpqDs`S!JOYu1SA$?HItv>NaM-9HOMKhf3N4Jzdq_cD8Fp}%_T6tM@jt!Ga$eY1vRR5Ut~9dIk0K~Yjy z6`1hoQ2Wuo`9re2vOyOoaXa(~P~>PJRiOwV7nKg_SfObCcMu7Y`;UzAu(}k$4bn)FusD?1 zq@~Si`L9uK0AeW9yq-TV!G57F*LC_Zz8CItmBa~GF)w1YDUPow|Hmg>UIuCqC9ScyO*+3}1&m405#eg5nH z&sX?m90Xn*W2mfT!iHtN@-5us7R_%?ld zJ(9QzOw^sUaotpj214#G8G1SHL^lHZ&7Kx5yIRq8rsQo>ZCWSA;`O6n>n^Z`eznlS z1yV*;Y+31EMJ1Y%B|h{@VRoeR)%<(S!g_F-?${|)py8^OG%0Gn+Dlbyn3qCqg+;Ug z*q+=eho)0}J>%N8Rws%{G; zR)sjqd|88#&fZPpcUuC;%P^RNxBTWC+_=icO0!%}SK zA|ADEJg_%8AgJ=1TZ70S<_P7p$N_qj0j~^b%6?T`?T%235k(1ieF5htZ$) zq2&iJxl7J#*|o}p66ai^)it_xj0cG$&5a9UqIHe312w86Sg{Q{pTszo8wvQJOSb*TQ zGmqD-wn{sQygqFF?WaPC-Swy8?{JzNMHRl$YC8|VAaH{rekHDCFh8T^y7FdP>-=LYG2jJ7yAt(oQc0Yzl8&O-0k%rDT;A#@PMO8<+5WcJ98>_a61z@J2EEOoWE1i8#s&C3mWlU0ij zcfCpb9YtvvtCnF45P(ywV?26m*J5aFn%9i|hJ1`614T0EDN5F=<%5?PENq^Cv4*e$ zg>Z^Vs-c7OO0O5_TCXZEge^lpTrp!iZLc?`p*toy92pK| z(EjHQ<~FW{yE?Uxk8*hb2lye#O|!Z-X5WHTbY#nGE=5%5tUiDKVGGh26gDZf+w3x3 zej8kbUB6V*3;XE7isj516oXe>d6t=ei%PiYCkbti%Sm>CA%D*p+xdkx?~* zgY3AgNPlV0jytToiVnEC%+v3Gv~4BVejZQ!)In(yS}}JDNvR)35bgrn^J7e{e$%&S;h;o!dPHG81k`n&4QN{ z$T`~OHNn~y)H~v3S(+E{w8$RMBwrW;g5-F`CCwT@j@D@Pc7b;dar+OL(K0|*`MUie znKviCN>`k$7G-B7+q5#S_=7eZq5lL?zG*bv#guJXGj-O!EhkaF%uTx8WPc&<^YIO| zJNRGhL$re9cFdr^T>AzSx=h6m4`6uruEc`K6DZvEehTsVIC1-RJK3~;3;}mp`mPrt z_3ah&+>ZthO&VL!kz;?1TK(|uAVZzmmV4`7b2HzK_pPnK)8iiv8lA-5CQ}!jF17YK z>rO+rkoGABs0mq}OeVT#Wvb6#RvMsR2Zv6-(v1|Gb2i;h?UaL47if|aJ$oyfF94|n zgriGq8>QPiw(|%pgQ1<_q_6!rDb|2_@lAX<2g^58%l z`K%B}exB1tsA}c|%%AfeoB9e!r?fs(w3=Y&B(RP3J^-p1}p*FKw)YEuc$V^kI_v|$dH?yCcGq<<5{RS zBl^i5)4=f|1&w`9T3I=ZZ0aheAGPPB*qOKMU|>&e^crWNORdqR_hcObW2EOvU7a`d zM{jN1O7OUuPa*Uu{=|yO+&0^m-iMZl-|dP#5~rHl&P;rA#nf_UjX^WnaPYu|wp>1w z0iBcxDZ{lrgXa705j~hAXjfOT%H<-FF;18aCH$FF2R3rQ%+C)~i;A)o(MS3x`UZH% z8%_mv17_kiF_+S?6eVm*a$Yhsz7GjJs=MDPP!Rc9ISnR>S79&7 zTUM$rpTB6h;dE_Np_}Y9Kx-n-+J;BCW$P?wg^;E9#z=3^s8SEH-#E$C&+WUupn~VJ zlbHS&B&Wc#dyoL^hp-M`r6%Q=fe0Zm5GAG7zdGoXx$*XXjlWS3$O0acPWd38E*x}j zZr9FOCePa3n?qd-7;ZYg+i+B5&t60UF zBXzU(*BcYP9z8edp2eTj9PD$&+yCtCN3HB~sN`^^aMJ&iC5ig!HZHOb2%x2hWX;2@ zMM%2P-^_YZm|KxJ*M+5uwC!dd*pWod{|4)7eAzQ(cr|AW`UY|sA819ANfsg`hUqfk zu^{v*pxXhe`^}o`70ZkVWJ(o|w??%@MIyI0%~j~Srg<1nO(Mk%N@P17)ec^cS<246 z>UqtBR~-H2=-4F}0kGQuN!Il*?HWePOOI;B{zf#boFzVIK0a3K-f_JvBN;^>?_bPz zkJeaieJCsM3~m3jzCZnRxd>-y{qSZMniNF*c3C279464ZeOBW8rK|4T#_#H*8S-a! zx&|C18U}+@JPsf;8%@$RX$#VfGn8SHo3#V<|8Z}v#fptR>H4q3gjQX>f~A^u2i#16 z9*NxLu%`j>L^GKD90-tFeMwKXX&$Lb6Z~G9jH$FxHMg;5iR+vludq9an5cmR;7#^) za`(8Vx6g0I*LrgivWl+ksPfrIU7;$E+)#BR$8>kqhVm>jq$c %+ zXX^ES2PlB!OL7r$t+>-M-zsk)-D~dw3j5Y-dhh#h_69^5%8~RM-~3)9btUpf)$Zpz^N0{X zheb|2*)&VdrK{X{Ys`6xQzf}rRUnV}Nfc&{CQ3(IkPLzSSG@PH+Va=e+L8C zPtR*e9asr2#Puh+BD%4<-(<>ISyqtSNg6}ez;i7hre*XZ>(oQj=^epzY`&34@7hhr zZX6y*uO>L^JwsEQ(LxJ+LduVjPjoYtq#{Sk+{0(4f8j(7V90;|OcK?%{wzV91^0Xi zDyzs4IPEfTP_qQQ`QGN?l;uJ?Y2NLFHWagtZB>E}EyjbdU|ME0~9ZI3|O>n z9{-7j-PR@@-ueR$!Jg%9V7}oD1w)vhylZt8+9?9z)*^-6g{sRZ?+HFesAX5<93fUY z?FGm!ZAAda(RpED)-!X5)C~{!D*) zpM`QKzO_TjQ00Dsc{34&!L^Ay9odLiODRi{GqJYA+Z5;CjtTI9-_YWGkdIe<&p`$k1uk;G>B-^{7owmPlIn#UJ>qHo*9dCU5$hr~Kg30=u< zg+E`-&G^GgqZ=EirY2eLkXw8(T;PbaL!IEOlS)N9VGdLjR!>k|oA~_|&3e@DUZCG-?O#Xzz2QIl1@;vDj)1fPjv~r!wqg#?x|CUUi(kDgUp*uo3barE!dZ*AO8KD zURp{A+EH`yjJMzbVUXy)m?7p9|iHSLhJj>80{s_5TaztKf*;_4=hJLgPV;c&_7y*fpS>hMh|5 z^%tOS+ghTqCJ#aNd>$?No0ERU*7o9QO}b(2HPPUK^JmZYH{C{<>x;tcr!DE-U_Tbc z*gBVoyAaZ&hc>mgyBtm$wlWvZYBsNeoq*f>$F50DHw?mZ%<7H?f-w7*ozl9mr-Ftr{vznDj8L`wC*?;q{4tJWCfk5h%bk!W%Xb zHR72W@(t4Mdm~(DWG+N@)mk4C&K)zNJ|D4c)&DdQKu=qG^uYSYpx?ih*3fC19`pf= z7wfq)%S_H%e88ZqMO;z?}}&v|l}JN}&h)b7dte&3Uzsqh3P#hm_65 zK=QHvON!a+sP)M&JaJ?|GWpGVk;NTzINho(K-sHU-Gf7!Z*7`7a0C zE|unz`*gdx%XpF-{6VJu+`bz1yB;g5BA@CntFK=mQC|z{ozMp(?N-X{q8R(!7Y@Fv z(^;kLIxJ-xj+GrXae=s<2tPWLpmf=&SNV20BM&#Kh&!!2Wu%i0yV>d@STm*h8aQ%= z)Lb1a=}klv$NbAVDWjaJc~j2xbU1+9S$6|70i1=xYMwc-2yxViVbxJIL=tlMzcH^I z&aF3qWU_S_-JRm)VQgKk+3pBu@NsswT|y}jo%I00LSd_902=g%B^Hmb%=Fm4_kNEl?| z%EzK#U0(BO3Zm*d{DVU0SHLAgy55`8ofbdc;z6GNPZDtpdCgZ2&x3Ke@89PF&smWf zVPP|iBc%NJwo2cGHtUPRkXz9^bHyG&5w4{=w!J&TbBm3gF%F!)K)GdB*C z+MAoTY>c#735l*cmGQ=T<;r=r&(l$WgP&W4w^fv7v4e8?ynS1vYOWBNdJHxEi*u!x zgbmJHOhb;vG5!kY&3}|#Rk(~Psam?^5$eRo*Q5&u>=`*<&K|O(YRa-8L%u>4%imb> zB*-$I@l-PKh@FufVbYAqUws#abO6h9`{#Fmc;FsHwGlfB_3n#jbm0z&IH-xt= z=~O<@_LIc=jx`2i7pj^^lanFek4kXIWHNV^XYck>==FmSEX!W_HUo*#g}AYua2`6< zc$d41>{W(CVx2Ot{81L3&RF&_Jx;Kv2v%mN%v;#p+r_BQnGLSc27ZA67F)^?9_jx~8id8fg{9y$N|u45f;G zw`n>jIL%gw%oooT|1RpC@2k+Ca(G9&KCN9{tZY|Sd!)DIX%9i?`i(&fr>eL%!;``R z3chzO&%JxC>ldy*3IdlS60c2R!4rdnksI-8Xm+M|vPk(&fdaXJimVd`yZz9FfFmTI ze+0vJE{|AV=58fZk5V6?qR(4CXNp%Wi>(Lt!&#p&VlN_uAg*mD7LF>jZhVrDcW-oz zt{z9U7C#hTShgDCR`Rr%e!BW|6f1aEC)H;mAjR3JA(C zgJtok2pO*^a!SOt))D(Oiy^!+Y0=|st6LAHwDVfFEEViK6}FQjaq%0?l{EY@TdU5UhQ6s>%0@teQuj#!=2!nje^Y?8H~JnnD=;ro9v zq~vqwMs&-mihb8M=)Pj9D^5GTKOMOFB;@n{LG+LDU_LTI1>2W(<$qMd>|NQv+U$Zd zmp25!F zu9OyWZvhaAdwb8gD~o^RhU}Z=w$^wkDFgdX+;}X!0;VkYUv(R}xTf)JtgSbiu6YD| z_fbiFU(OP3(a1}}XPk==ioM@D;dt2=8*YhR^MFq|L2#3+Gt?lEm`$6QIi71V|ulf!usaD^!*k;|N#72X#z6M5orSrZn5K15g+x)Z} zwP`N5vrl!CG7{(xxcb{Y17zOl08BF^O()WI#ushyo)r5c& zl`NJ{lGpV2;mAdjA$aEM&Y{z8> zW~4j%%}0!ISCC+}&9{Ip-vqm{3RwA_t`)@Fh~#SOGTd9qF3*GXDfPxUsme=RGw<(7 z!Fu1>rmlLiTjwXw-F69;?NZgOye3nU=Ffv07iWc3AfJVh4N{sBO@p@OKMXu%=POf*F#DW- z?M9Z=aqTX7R(N@Mo&hR^Zpw+!rk>KP*M9@M9<=1MlIgI9U4Ql*aSCp{YA`$rLWxbh0daEF_Wq+jPLuZRdA@b7Afv&!zXcP~>GusJI} zk55kd--aP>U3iAh8%%k`jm{UwxByarbMNV$ykDQAm^tt+S&-PR**$mI;xzVf>(jBQ zS=X+8E5SEh__SR3zxJirphLMzf{>S&Cyuj?o^t2F#Ez2zyfnG)yKTby;2Q?S8pI!F zDM6}LC(weGSIE^761aJ~RiJ5CG8o?s6o(`+{d8M}H?DEORrd=TTwGkf=Jo4f?Tkd! z)Ua&}?QL&|U3m8ULm5VR9f|KgIsUS-Twf2`T!Z?I6Jf*(F(lyg;y=)Cvz}($0s9ZY z*$9ks>NyMUdS+T2+j|#}t$4SdpC~>}*6B;sDQ$;!UD9p|ZUh2cyR{fZ^N;24A?O#y zzcGU|o_XIFAw3TM;ZhQ;{^AB21h%yg53&)uqegmJNj2+S8YH>wW3EJ#MEkOgr+nX9 zoZ=GcRPkDtAraiLs_Tug!@83{&`OnP@cxJUSkh6}=5_ljrFp5drC zKVRS+6vfB~onKt=@Nj?F44aZHPPlshjM&1ishA`=@7`XsU9YjW<@WZLAOH9xP22E4 z{`&XmQO?^pZ&)suyuIJy@aeh!^y`<5rv>}%hClvv&%eCP*_JgI3!kRy+h2Uk_4TzE zy?{DaJl@|ko%oEtQ5R};e}7M`qCVoLZ5v*^c)@fsp{*OgQS+STdd&}i_@2e(1vfvv zMYWd2#W|Dln48<1-Z$(IfBc@2NqGDEC#FS#vW|Ce-cn2^{N}g6qiI{tE-!fd{vDgT zWup};Pe^GQPv`7*JDR59Y&v84xFjvQ>T796kr%xlsqM0_)J;t>^|d~t&ZkZsipS%z zSM)~_)6tm7DW=mYIzFUqk7HlD(^|{o?2LVvk!5iiiHTjnsHN#wi$ezHrVcqAck%8Cz?)xVT`u-S&H2)KOy4(b~uVjz%M_bwsg`{S`6P zTW!7gDb?V_f39`5-@9pNXwX`-+N}HN7Oj1yLE+XatWQtY^&`)7Kdw$64fIJ0oO3=a zcPIWzot!lGbmHTZJ;+UH69PtnDJ@Vf>3RC-B zn-*`$#V0=P2B(ect-QV+*DExQIT$uV5&Lr@t8+e*1Emhe59h;FMTJ&)Lo^@5RS*@AR=ajZ(Q||bu-~E=!c!W~0T0XKE zkD1J;yt{r!mSvnz7Tn$4^1t3Zk|vfY&QPY{!^&Z+9Vo?%Map`0PZp1PzL@dvUtO`; zta)55*_M0Ot0kk+i1+W_@#>qeST2|3X@+%{Cr_XHG~!vx>({S&^~Foxy#0ym>$iOQ z>I?2}?^v!^ELR)0Wl5aIymCcYv!}L zPj*>VSPegYxF(-YDeIa)eE&W5&asX)qq7;e@7|FnDayjG@&$LWElpK2D#px56COT% zV7=LpO~-6E8`3z!7|oNbr&Mjtd^V%1Dpq$7L}}6&&5q-kv&F(&)^qOyGRksvWN4d) zsH>T~-|w;enyknvMg>l5rt=wPU9nlNnT*HY-RA0?hxHN_8;UgRebyS~eMYOs7XZg- z(%kC=r_*U~IhK0C;t-5el>3s=c+}U{m`-L)#uJP-te-6D5Z(xq&NPE z({&F{Mv%-R^wrP9Ah|`KF_K8zn(_&kn?K$f})fnTmx`e6d1r$P1`R53K2s&ER zB_*{-02p3}+P)n(hd3_FeGZ)I?(xYHJmC5CSE`Gn7`FX6og&~0<-U@pzA2g?uV4jjT-8aw0z|8ammZ)FS)(BrCx8z zlZ+%wshgVZcH`?GSj%>^VZNAC)iulYia7Fa1jS^^hu1%`-)y;iSn}-Um)t&lAk!)L zw>Mm#oiU$!caCzu_nd}uJTBLK`}Nm6JUq}?M;u%J`+xY6%f*Pr*_`jbf6Km2ut@@& zEnhtAoNHCefA*)}@YQI9vkfZJ6j{cHH*dMUyXBi-{gS-!O8hiR!6|M&+;a8Ohs>Q7 z6QU&J)syF(UtaRK-J@d1&D|ZB7w06YS8!jye#2_H_dB0ZGl@yGrruYyb*dy4h@wq$uYc zNuIIY?=VW!YKYRL6X6w2RgsPgl-7PssZX{#o6XSHM=+_#u&+w8A}5J_I(la<+q(4W z;xH`NEAM)ve1$b{NR2U3;tPVSmMD&>Ylvgh8(L!&E)01CUz-3xfr%rMJR?rx-tdtm ziI4CQg8m#=cZ&E!zzjJ&=Pa%5>h2D}?_klbQQCHkaR95PRwxy9#tyM8AHv-ZSLXxR zT|b|^C`P> zPhB-^w>uslS3IhQ(m5_JE?6#?q{+cA3}Cn4`~9T6D65p}McIpsOQPtIVFc~1&#kju zUR`?Yd#AWx%;%U$3It`0b02f6v=7K{Td$83C+M=RnM@|oSZeLKczT5~hWphcCXM@$ zukCi*hq=|A`-mhWwbpjk&Nk$Q&tI2!Sy_ZDl49x-aiKb}5sR}}b484mS{q4{`2F0C zsVqxSUN@&Zx~ts*fZDdD+;zp-jqd&HobilCoTYtbHLVPF?Zw;qV%{4{eeApk;4B-V zRn##LemqeW^}z-zGPIS~`>DudhNuW+yh)O<+wH{Q@v%F~Frs33gJ33DyRUD>GcXjP&#^M(D(4OFx+l9R_B~g#T~TusreDb zY+@p+PM>2fy*0f*IPmG7tZ`rrZEd-{d_s~$Y}Q+T`tdcdUcB@=oqY+`v0N@u#(>t; zrROBJt2Ixaz4S(p-ImdOiiKn^k1Hz<7&ss zRvy=62SF&R&3n*)7nt$j)}t@?h7>PU2UayU(*&*j|8X2+l6o+_c>{=}_pr!2&`i^m{jOm$_DK`;5D?%rm-8uL2*F?o zcA+m^_`wbyD&%I*%N#gwnDgSsUjkEqMN_mWQx@#U9Z=T+BCr&Cs& zCClXlo6Ux|H}6^Px17(WES^4NJT4fI3z9sdtt_^!(Iz4b9Laapjx>td-afG1uF2Av z_40wuZp)WH`+e}989F?lxP z`pw(Uxi#a-lPA3V*(;1uBx%m#Y{q;sB{mU7ma|$e0nKv#$nEVd@7}%Z{Ld0T+}-lH zUNN7YvEA%wlbD?bCMjtYqZ%I`_4Mh}p2IfAa5kS)?e`Q#f>MsrbcA*_=d&pfH@8?K z@?y$(zToW1IbZ$aYo0xO&U8BU)=lMWzno2G%=0m;$0e}R;wa&)%jYK^25Fl5+=WHaXH^zIILTrhMGx~_8l=b!k(M!tZ#~EXyLz}*yk0sAXo&TjlYaeW(jX_6- zD2Xv~moZ7TRFy@M_6OW)4Tc zcsUo=6;|~1Lk8e;Y7C(@_egZ@^nL<(R{4k!pYXt+B;m<7^o9JCn5+QRTH5Y?VLJP! zZD?0(KD_yXyZ0Zc8$TEIcE{w*pYU0h;p)b7ipnQIRXA=w+;ou;XOv~x>vit#-g7oT z=klqqDV$~*-~H})L{Y?x7caQJzV11e+uK|6Jnuzl*R=e1fAcroZr4m_6EyJMyHz&| z$IqT#p`5SZN^AMXD4xA~$@zTFzT8un6;H07^mTxz(I#6{ zyE`TqXQa6gnvc_j*<`|M^GLaGaL)4X{W~reXI#H~&*jwx4-XIQHam88$#gvNmCuaj z;{2)yvDJ1%-Fio9i{giycYN4vDD#NLe8y}tM`5|Ty7F~@yCk00T1*`K(5@uq!|ex5 zl;E%wlM#>W6=!D`6w@)~eovex-IyAxE*|#T;(}3{VYKGz^3oeTx@d)bEu+!6=g2(3#(g|+97i~O0tT%#M(HkW?!ft)NKscI zjeB4e>#Z+bp7$y<=PV9;NKC9XiUjL?s(gj%#Al7QEoHUulOD8fOC05-nFd-U-CPt! z9{h&srG|tYa&;kqghc*HeVjY(5FP&QoWiytkbRs9W(Z)t3kT1Uijit-U}G;M>{F=q`yEk|qm*X1+oFy4$nYYrH(F*{#_Il&C{Ml9c$bt^Xjf^6(eZ&6 zohFKPp9~de$g-5WZfM(%(=_<+8`W{RjwnhI&aE^f?sHP;2euewFIY^Ft0c?Bl5eqt&3D#aJ2h!3b29dm`I#{rw-9jwijc zev;<=WjOT!03ZNKL_t(IYrU^kQIO>^AC@b!F7?lBI^q8D!CN}Zl8cKA_WK>UL%#u@ zK7GoY>ubPgw;6YSP$DK7t-Z3_ImY8L-~Z-!{0~1~v%PymR*d=M`xT|tG>sQwC&r-C1JsmUi}Ru7N7xqge%&}>R>?mv*E z8M<*O>llwlL~+FJ!#%Erx3;9oN2t!(Je!Qs)+hX&&FAdOJrVx!DRN)(GdDh3MMn|q z&5p~sJ^``rd@Gz|zuWoRH9G1HSYFSUrn2_Fv_n-@5E-&A1TBtZj7~d_PuypY zrLeYDfMGPw*mluEz6^$cUb50Sr+U4tr#C+rbzM=6QWS@bNlEH0-Mwzo1`%sv4UbTa z8**NsyTW_@kH*oURr--0@c zekXml3SW>sGCqGB>SP=8dlo<@>*KRg{7 z@}i&^O?=|j$poi0N*l6#gu~FZjv`AjNsKmzC`)`$zVrLZI!Mx($!yxEi&x4MyS0ue zNuX0bWm!(!)}6?#sjG%Kfu>WlM3Hx5wk<@lqAGojY}+~%8lw}GGTw)-Gai628IGpi z_XY|Rc^Xa<54KtxzlW^%eYMt-#Ay#i0^U(%eD1;4yU9hd!M1b}8Vyb3_pDEklb zs%t*n-ZIJyqDZq_t%;T9?Bbjs|M&x0QE)zAu<0@s_a69h1STTS62ATRTL6+Iqukdl z7BlYe@5%EK505u|_uJplHjan;CGS4G=k4`%msE4j{p|z$+ea=JPq_Q=o(2U?$#ir< znrN!3!PX6t(l}QVXFmVji`UHn`TZDfh%_ z%6Kv3#jBUzEd@gy`&ihfX|P)Hj~{;GKm8Z~G2_$_Y0dO(&gJDLd7ks~<;!08mZm95 zntE5G#lris0l)agw>;e5F&&Nh_7}fmI-g^K7hnC1^NUNOI6-N{<>jRhtXIm{deIt_ z#EfTCis_6f%W0LyL>bm8Oyost6Gd$6k~rcMe`^s~HwjoPn zoPyoHp|u)COxwC%ye-QTr5$DEE!IY-q-l<|U`$Ng95_&6Jgl|gVvLE26GL94y}0Ui zd_~|YQz6DlT!c~wi?MUg>*KT|iap)cbx9O?@wT;fZ^f0Q1@aC7!;s#~vhEX??)IC& z6-JZi8A%d@ix`i*e$-=vr?JQ+IP1AlaqVf_)^mPBh^KT|r#Pce#n(zlwf2J(nLY%D z!?Oa2$5~_Ko$@1~c`glF1EInqqz?DQR`YyVN-XU5_Y6fEJ5R`}S8_tPjgAQ5t zBdhVJKw3Z$i|$1Ix~j;H;^zDBsjG@ONik966D}47MU?RP_~?C;(uBIIxV^n4PGhnx z$0)~gxgyPCR_lA}s&fmdDv~7S{9;a7R%B^Tp68rjoUwYmBUY9#zWSPnyGN#DU)WkH z#Xr7#$3H%9iHu_TxZ(X{+4novj%krmHx=t`%fI?!&ToG6JHGtcE3!DH-udjt)9HkK z>_I>&UyNqE^4VRc({m{_%m;X4Uz=dDoY^uKDhFzxDNq)0BF- zWi}eKx_=-|Vs`5dF`6Vxxqp0Qx7m0xX_VqR2XLL{{Py92Wxc0}6V4~IUdb< z8-#1-dC}>{I?*giu${rd*PhT_(eaKGQW3Rl>Eoc6^C087H)&hkfs(|FmrZksA5PK(U5W0nZCi|vdV01_TyLVD zLkwx%+Lp{jJ{CWUd#+UCEky4dA_PY&h+ma@R@BjECtK}AJ8x)qd z*^|eb-EPOWgfy**(EO`^`JXV!$5h)LPhLEy-0iu(zGgn2@c7}DyZ0ZsIy+~QXPlkS zDXSg3&5HeMNnWIE);p|iD0dr7>o^-vsa7jC%SX01x8x?Kh!Wm>{{wMsc=PTJ(a7tI zX0ruO8&u`UZRB-K;{>H!ihN9B;rqLLzWw<(eEH-l-~8fRo_+ZWYb`Hdz9i0478mCv zMZp(eeZypa&eP|wSj^7&K??l+wBo&ljkFnxIn7}uzeqp zWx1zc>ni_wBt^_iz_RX=Q~-UV0i{%@uk#$KRtZf_Z@>{FhxAA5h(>E3mrEQqpgWhC z9HUbn?w2%8h1NcEb%k zjCu3snwL+Xu-bWFDcjUoOBd6au(?~3&!>z=IX5>q%%@Z0yx@l)ejtf0v+>-A8kLs& zcdz?-OVbpSCTt#;{@4=YL8T`8J#Fp7GfkPo6yCVR_HE@bRL~L~QDkEJ@gI*If>`Ga3u?`5d%jx$!~# z^}b}iUNfD}*=>FN<;8Tum*DvMl4-t1oze{f1Rj z(zXr%bbrrmHskBBzh%8%^Zfa9ZXf*tk>)wssLRopCVeWTIF9>>izteCczEa|Q~Izd z<8@z+1M3V**UXDCRjb(UkLy*)ev+sODN`wgEdx;>1qsfo-8srcud^PtBeOiXIyI_iG@obzru zRaMb8s_&P?0*5p%{<79u;=}`!BBm(DJT5No@ZxRb=|2fbKt4&c`ls5svSK6W4Z!wtYs?s3$_(Fkh~Rh~XJ2-rhXQkV3s?6B=q z@A#a7B7B!~2YDZ$ZPWnZ45-SB$@*jc;;DBl0XlW~Tf1YmKr1!MJLUVZzmh@PIR~vT zo2l0;-u(4nVb�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 Info
  • collate C.UTF-8 ctype C.UTF-8 tz UTC - date 2024-12-11 + date 2024-12-13 pandoc 2.9.2.1 @ /usr/bin/ (via rmarkdown) ─ Packages ─────────────────────────────────────────────────────────────────── package * version date (UTC) lib source admiral * 1.1.1 2024-06-17 [1] RSPM admiraldev 1.1.0 2024-06-06 [1] RSPM + admiralonco * 1.1.0 2024-06-19 [1] RSPM + admiralophtha * 1.1.0 2024-06-19 [1] RSPM + admiralpeds * 0.1.0 2024-08-21 [1] RSPM + admiralvaccine * 0.3.0 2024-08-29 [1] RSPM assertthat 0.2.1 2019-03-21 [1] RSPM attempt 0.3.1 2020-05-03 [1] RSPM backports 1.5.0 2024-05-23 [1] RSPM @@ -245,6 +249,7 @@

    Session Info

    diffdf * 1.1.1 2024-09-24 [1] RSPM digest 0.6.37 2024-08-19 [1] RSPM dplyr * 1.1.4 2023-11-17 [1] RSPM + dverse * 0.2.0 2024-12-08 [1] RSPM ellipsis 0.3.2 2021-04-29 [1] RSPM evaluate 1.0.1 2024-10-10 [1] RSPM fansi 1.0.6 2023-12-08 [1] RSPM @@ -358,6 +363,7 @@

    Session Info

    xportr * 0.4.1 2024-10-07 [1] RSPM xtable 1.8-4 2019-04-21 [1] RSPM yaml 2.3.10 2024-07-26 [1] RSPM + zoo 1.8-12 2023-04-13 [1] RSPM [1] /home/runner/work/_temp/Library [2] /opt/R/4.4.2/lib/R/site-library diff --git a/site_libs/crosstalk-1.2.1/css/crosstalk.min.css b/site_libs/crosstalk-1.2.1/css/crosstalk.min.css new file mode 100644 index 00000000..6b453828 --- /dev/null +++ b/site_libs/crosstalk-1.2.1/css/crosstalk.min.css @@ -0,0 +1 @@ +.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px} diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.js b/site_libs/crosstalk-1.2.1/js/crosstalk.js new file mode 100644 index 00000000..fd9eb53d --- /dev/null +++ b/site_libs/crosstalk-1.2.1/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + for (var name in df) { + if (df.hasOwnProperty(name)) names.push(name); + if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof length !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item = void 0; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.js.map b/site_libs/crosstalk-1.2.1/js/crosstalk.js.map new file mode 100644 index 00000000..cff94f08 --- /dev/null +++ b/site_libs/crosstalk-1.2.1/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +} \ No newline at end of file diff --git a/site_libs/crosstalk-1.2.1/js/crosstalk.min.js b/site_libs/crosstalk-1.2.1/js/crosstalk.min.js new file mode 100644 index 00000000..b7ec0ac9 --- /dev/null +++ b/site_libs/crosstalk-1.2.1/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/site_libs/crosstalk-1.2.1/scss/crosstalk.scss b/site_libs/crosstalk-1.2.1/scss/crosstalk.scss new file mode 100644 index 00000000..35665616 --- /dev/null +++ b/site_libs/crosstalk-1.2.1/scss/crosstalk.scss @@ -0,0 +1,75 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} + +/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */ +.crosstalk-input { + margin-bottom: 15px; /* a la .form-group */ + .control-label { + margin-bottom: 0; + vertical-align: middle; + } + input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px; + line-height: normal; + } + .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + } + .checkbox > label{ + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; + } + .checkbox input[type="checkbox"], + .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 2px; + margin-left: -20px; + } + .checkbox + .checkbox { + margin-top: -5px; + } + .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; + } + .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; + } +} diff --git a/site_libs/datatables-binding-0.33/datatables.js b/site_libs/datatables-binding-0.33/datatables.js new file mode 100644 index 00000000..765b53cb --- /dev/null +++ b/site_libs/datatables-binding-0.33/datatables.js @@ -0,0 +1,1539 @@ +(function() { + +// some helper functions: using a global object DTWidget so that it can be used +// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's +// dynamic scoping, when 'code' is eval'ed, JavaScript does not know objects +// from the "parent frame", e.g. JS('DTWidget') will not work unless it was made +// a global object +var DTWidget = {}; + +// 123456666.7890 -> 123,456,666.7890 +var markInterval = function(d, digits, interval, mark, decMark, precision) { + x = precision ? d.toPrecision(digits) : d.toFixed(digits); + if (!/^-?[\d.]+$/.test(x)) return x; + var xv = x.split('.'); + if (xv.length > 2) return x; // should have at most one decimal point + xv[0] = xv[0].replace(new RegExp('\\B(?=(\\d{' + interval + '})+(?!\\d))', 'g'), mark); + return xv.join(decMark); +}; + +DTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + var res = markInterval(d, digits, interval, mark, decMark); + res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) : + res + currency; + return res; +}; + +DTWidget.formatString = function(data, prefix, suffix) { + var d = data; + if (d === null) return ''; + return prefix + d + suffix; +}; + +DTWidget.formatPercentage = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d * 100, digits, interval, mark, decMark) + '%'; +}; + +DTWidget.formatRound = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark); +}; + +DTWidget.formatSignif = function(data, digits, interval, mark, decMark, zeroPrint) { + var d = parseFloat(data); + if (isNaN(d)) return ''; + if (zeroPrint !== null && d === 0.0) return zeroPrint; + return markInterval(d, digits, interval, mark, decMark, true); +}; + +DTWidget.formatDate = function(data, method, params) { + var d = data; + if (d === null) return ''; + // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the + // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)', + // i.e. the date-only string is treated as UTC time instead of local time + if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\d{4,}\D\d{2}\D\d{2}$/.test(d)) { + d = d.split(/\D/); + d = new Date(d[0], d[1] - 1, d[2]); + } else { + d = new Date(d); + } + return d[method].apply(d, params); +}; + +window.DTWidget = DTWidget; + +// A helper function to update the properties of existing filters +var setFilterProps = function(td, props) { + // Update enabled/disabled state + var $input = $(td).find('input').first(); + var searchable = $input.data('searchable'); + $input.prop('disabled', !searchable || props.disabled); + + // Based on the filter type, set its new values + var type = td.getAttribute('data-type'); + if (['factor', 'logical'].includes(type)) { + // Reformat the new dropdown options for use with selectize + var new_vals = props.params.options.map(function(item) { + return { text: item, value: item }; + }); + + // Find the selectize object + var dropdown = $(td).find('.selectized').eq(0)[0].selectize; + + // Note the current values + var old_vals = dropdown.getValue(); + + // Remove the existing values + dropdown.clearOptions(); + + // Add the new options + dropdown.addOption(new_vals); + + // Preserve the existing values + dropdown.setValue(old_vals); + + } else if (['number', 'integer', 'date', 'time'].includes(type)) { + // Apply internal scaling to new limits. Updating scale not yet implemented. + var slider = $(td).find('.noUi-target').eq(0); + var scale = Math.pow(10, Math.max(0, +slider.data('scale') || 0)); + var new_vals = [props.params.min * scale, props.params.max * scale]; + + // Note what the new limits will be just for this filter + var new_lims = new_vals.slice(); + + // Determine the current values and limits + var old_vals = slider.val().map(Number); + var old_lims = slider.noUiSlider('options').range; + old_lims = [old_lims.min, old_lims.max]; + + // Preserve the current values if filters have been applied; otherwise, apply no filtering + if (old_vals[0] != old_lims[0]) { + new_vals[0] = Math.max(old_vals[0], new_vals[0]); + } + + if (old_vals[1] != old_lims[1]) { + new_vals[1] = Math.min(old_vals[1], new_vals[1]); + } + + // Update the endpoints of the slider + slider.noUiSlider({ + start: new_vals, + range: {'min': new_lims[0], 'max': new_lims[1]} + }, true); + } +}; + +var transposeArray2D = function(a) { + return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a); +}; + +var crosstalkPluginsInstalled = false; + +function maybeInstallCrosstalkPlugins() { + if (crosstalkPluginsInstalled) + return; + crosstalkPluginsInstalled = true; + + $.fn.dataTable.ext.afnFiltering.push( + function(oSettings, aData, iDataIndex) { + var ctfilter = oSettings.nTable.ctfilter; + if (ctfilter && !ctfilter[iDataIndex]) + return false; + + var ctselect = oSettings.nTable.ctselect; + if (ctselect && !ctselect[iDataIndex]) + return false; + + return true; + } + ); +} + +HTMLWidgets.widget({ + name: "datatables", + type: "output", + renderOnNullValue: true, + initialize: function(el, width, height) { + // in order that the type=number inputs return a number + $.valHooks.number = { + get: function(el) { + var value = parseFloat(el.value); + return isNaN(value) ? "" : value; + } + }; + $(el).html(' '); + return { + data: null, + ctfilterHandle: new crosstalk.FilterHandle(), + ctfilterSubscription: null, + ctselectHandle: new crosstalk.SelectionHandle(), + ctselectSubscription: null + }; + }, + renderValue: function(el, data, instance) { + if (el.offsetWidth === 0 || el.offsetHeight === 0) { + instance.data = data; + return; + } + instance.data = null; + var $el = $(el); + $el.empty(); + + if (data === null) { + $el.append(' '); + // clear previous Shiny inputs (if any) + for (var i in instance.clearInputs) instance.clearInputs[i](); + instance.clearInputs = {}; + return; + } + + var crosstalkOptions = data.crosstalkOptions; + if (!crosstalkOptions) crosstalkOptions = { + 'key': null, 'group': null + }; + if (crosstalkOptions.group) { + maybeInstallCrosstalkPlugins(); + instance.ctfilterHandle.setGroup(crosstalkOptions.group); + instance.ctselectHandle.setGroup(crosstalkOptions.group); + } + + // if we are in the viewer then we always want to fillContainer and + // and autoHideNavigation (unless the user has explicitly set these) + if (window.HTMLWidgets.viewerMode) { + if (!data.hasOwnProperty("fillContainer")) + data.fillContainer = true; + if (!data.hasOwnProperty("autoHideNavigation")) + data.autoHideNavigation = true; + } + + // propagate fillContainer to instance (so we have it in resize) + instance.fillContainer = data.fillContainer; + + var cells = data.data; + + if (cells instanceof Array) cells = transposeArray2D(cells); + + $el.append(data.container); + var $table = $el.find('table'); + if (data.class) $table.addClass(data.class); + if (data.caption) $table.prepend(data.caption); + + if (!data.selection) data.selection = { + mode: 'none', selected: null, target: 'row', selectable: null + }; + if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' && + data.selection.target === 'row+column') { + if ($table.children('tfoot').length === 0) { + $table.append($('')); + $table.find('thead tr').clone().appendTo($table.find('tfoot')); + } + } + + // column filters + var filterRow; + switch (data.filter) { + case 'top': + $table.children('thead').append(data.filterHTML); + filterRow = $table.find('thead tr:last td'); + break; + case 'bottom': + if ($table.children('tfoot').length === 0) { + $table.append($('')); + } + $table.children('tfoot').prepend(data.filterHTML); + filterRow = $table.find('tfoot tr:first td'); + break; + } + + var options = { searchDelay: 1000 }; + if (cells !== null) $.extend(options, { + data: cells + }); + + // options for fillContainer + var bootstrapActive = typeof($.fn.popover) != 'undefined'; + if (instance.fillContainer) { + + // force scrollX/scrollY and turn off autoWidth + options.scrollX = true; + options.scrollY = "100px"; // can be any value, we'll adjust below + + // if we aren't paginating then move around the info/filter controls + // to save space at the bottom and rephrase the info callback + if (data.options.paging === false) { + + // we know how to do this cleanly for bootstrap, not so much + // for other themes/layouts + if (bootstrapActive) { + options.dom = "<'row'<'col-sm-4'i><'col-sm-8'f>>" + + "<'row'<'col-sm-12'tr>>"; + } + + options.fnInfoCallback = function(oSettings, iStart, iEnd, + iMax, iTotal, sPre) { + return Number(iTotal).toLocaleString() + " records"; + }; + } + } + + // auto hide navigation if requested + // Note, this only works on client-side processing mode as on server-side, + // cells (data.data) is null; In addition, we require the pageLength option + // being provided explicitly to enable this. Despite we may be able to deduce + // the default value of pageLength, it may complicate things so we'd rather + // put this responsiblity to users and warn them on the R side. + if (data.autoHideNavigation === true && data.options.paging !== false) { + // strip all nav if length >= cells + if ((cells instanceof Array) && data.options.pageLength >= cells.length) + options.dom = bootstrapActive ? "<'row'<'col-sm-12'tr>>" : "t"; + // alternatively lean things out for flexdashboard mobile portrait + else if (bootstrapActive && window.FlexDashboard && window.FlexDashboard.isMobilePhone()) + options.dom = "<'row'<'col-sm-12'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-12'p>>"; + } + + $.extend(true, options, data.options || {}); + + var searchCols = options.searchCols; + if (searchCols) { + searchCols = searchCols.map(function(x) { + return x === null ? '' : x.search; + }); + // FIXME: this means I don't respect the escapeRegex setting + delete options.searchCols; + } + + // server-side processing? + var server = options.serverSide === true; + + // use the dataSrc function to pre-process JSON data returned from R + var DT_rows_all = [], DT_rows_current = []; + if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' && + /^session\/[\da-z]+\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) { + options.ajax.dataSrc = function(json) { + DT_rows_all = $.makeArray(json.DT_rows_all); + DT_rows_current = $.makeArray(json.DT_rows_current); + var data = json.data; + if (!colReorderEnabled()) return data; + var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row; + for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false; + if (flag) return data; + for (i = 0; i < data.length; ++i) { + row = data[i].slice(); + for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]]; + } + return data; + }; + } + + var thiz = this; + if (instance.fillContainer) $table.on('init.dt', function(e) { + thiz.fillAvailableHeight(el, $(el).innerHeight()); + }); + // If the page contains serveral datatables and one of which enables colReorder, + // the table.colReorder.order() function will exist but throws error when called. + // So it seems like the only way to know if colReorder is enabled or not is to + // check the options. + var colReorderEnabled = function() { return "colReorder" in options; }; + var table = $table.DataTable(options); + $el.data('datatable', table); + + if ('rowGroup' in options) { + // Maintain RowGroup dataSrc when columns are reordered (#1109) + table.on('column-reorder', function(e, settings, details) { + var oldDataSrc = table.rowGroup().dataSrc(); + var newDataSrc = details.mapping[oldDataSrc]; + table.rowGroup().dataSrc(newDataSrc); + }); + } + + // Unregister previous Crosstalk event subscriptions, if they exist + if (instance.ctfilterSubscription) { + instance.ctfilterHandle.off("change", instance.ctfilterSubscription); + instance.ctfilterSubscription = null; + } + if (instance.ctselectSubscription) { + instance.ctselectHandle.off("change", instance.ctselectSubscription); + instance.ctselectSubscription = null; + } + + if (!crosstalkOptions.group) { + $table[0].ctfilter = null; + $table[0].ctselect = null; + } else { + var key = crosstalkOptions.key; + function keysToMatches(keys) { + if (!keys) { + return null; + } else { + var selectedKeys = {}; + for (var i = 0; i < keys.length; i++) { + selectedKeys[keys[i]] = true; + } + var matches = {}; + for (var j = 0; j < key.length; j++) { + if (selectedKeys[key[j]]) + matches[j] = true; + } + return matches; + } + } + + function applyCrosstalkFilter(e) { + $table[0].ctfilter = keysToMatches(e.value); + table.draw(); + } + instance.ctfilterSubscription = instance.ctfilterHandle.on("change", applyCrosstalkFilter); + applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys}); + + function applyCrosstalkSelection(e) { + if (e.sender !== instance.ctselectHandle) { + table + .rows('.' + selClass, {search: 'applied'}) + .nodes() + .to$() + .removeClass(selClass); + if (selectedRows) + changeInput('rows_selected', selectedRows(), void 0, true); + } + + if (e.sender !== instance.ctselectHandle && e.value && e.value.length) { + var matches = keysToMatches(e.value); + + // persistent selection with plotly (& leaflet) + var ctOpts = crosstalk.var("plotlyCrosstalkOpts").get() || {}; + if (ctOpts.persistent === true) { + var matches = $.extend(matches, $table[0].ctselect); + } + + $table[0].ctselect = matches; + table.draw(); + } else { + if ($table[0].ctselect) { + $table[0].ctselect = null; + table.draw(); + } + } + } + instance.ctselectSubscription = instance.ctselectHandle.on("change", applyCrosstalkSelection); + // TODO: This next line doesn't seem to work when renderDataTable is used + applyCrosstalkSelection({value: instance.ctselectHandle.value}); + } + + var inArray = function(val, array) { + return $.inArray(val, $.makeArray(array)) > -1; + }; + + // search the i-th column + var searchColumn = function(i, value) { + var regex = false, ci = true; + if (options.search) { + regex = options.search.regex, + ci = options.search.caseInsensitive !== false; + } + // need to transpose the column index when colReorder is enabled + if (table.colReorder) i = table.colReorder.transpose(i); + return table.column(i).search(value, regex, !regex, ci); + }; + + if (data.filter !== 'none') { + if (!data.hasOwnProperty('filterSettings')) data.filterSettings = {}; + + filterRow.each(function(i, td) { + + var $td = $(td), type = $td.data('type'), filter; + var $input = $td.children('div').first().children('input'); + var disabled = $input.prop('disabled'); + var searchable = table.settings()[0].aoColumns[i].bSearchable; + $input.prop('disabled', !searchable || disabled); + $input.data('searchable', searchable); // for updating later + $input.on('input blur', function() { + $input.next('span').toggle(Boolean($input.val())); + }); + // Bootstrap sets pointer-events to none and we won't be able to click + // the clear button + $input.next('span').css('pointer-events', 'auto').hide().click(function() { + $(this).hide().prev('input').val('').trigger('input').focus(); + }); + var searchCol; // search string for this column + if (searchCols && searchCols[i]) { + searchCol = searchCols[i]; + $input.val(searchCol).trigger('input'); + } + var $x = $td.children('div').last(); + + // remove the overflow: hidden attribute of the scrollHead + // (otherwise the scrolling table body obscures the filters) + // The workaround and the discussion from + // https://github.com/rstudio/DT/issues/554#issuecomment-518007347 + // Otherwise the filter selection will not be anchored to the values + // when the columns number is many and scrollX is enabled. + var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot'); + var cssOverflowHead = scrollHead.css('overflow'); + var scrollBody = $(el).find('.dataTables_scrollBody'); + var cssOverflowBody = scrollBody.css('overflow'); + var scrollTable = $(el).find('.dataTables_scroll'); + var cssOverflowTable = scrollTable.css('overflow'); + if (cssOverflowHead === 'hidden') { + $x.on('show hide', function(e) { + if (e.type === 'show') { + scrollHead.css('overflow', 'visible'); + scrollBody.css('overflow', 'visible'); + scrollTable.css('overflow-x', 'scroll'); + } else { + scrollHead.css('overflow', cssOverflowHead); + scrollBody.css('overflow', cssOverflowBody); + scrollTable.css('overflow-x', cssOverflowTable); + } + }); + $x.css('z-index', 25); + } + + if (inArray(type, ['factor', 'logical'])) { + $input.on({ + click: function() { + $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); + }, + input: function() { + var v1 = JSON.stringify(filter[0].selectize.getValue()), v2 = $input.val(); + if (v1 === '[]') v1 = ''; + if (v1 !== v2) filter[0].selectize.setValue(v2 === '' ? [] : JSON.parse(v2)); + } + }); + var $input2 = $x.children('select'); + filter = $input2.selectize($.extend({ + options: $input2.data('options').map(function(v, i) { + return ({text: v, value: v}); + }), + plugins: ['remove_button'], + hideSelected: true, + onChange: function(value) { + if (value === null) value = []; // compatibility with jQuery 3.0 + $input.val(value.length ? JSON.stringify(value) : ''); + if (value.length) $input.trigger('input'); + $input.attr('title', $input.val()); + if (server) { + searchColumn(i, value.length ? JSON.stringify(value) : '').draw(); + return; + } + // turn off filter if nothing selected + $td.data('filter', value.length > 0); + table.draw(); // redraw table, and filters will be applied + } + }, data.filterSettings.select)); + filter[0].selectize.on('blur', function() { + $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); + }); + filter.next('div').css('margin-bottom', 'auto'); + } else if (type === 'character') { + var fun = function() { + searchColumn(i, $input.val()).draw(); + }; + // throttle searching for server-side processing + var throttledFun = $.fn.dataTable.util.throttle(fun, options.searchDelay); + $input.on('input', function(e, immediate) { + // always bypass throttling when immediate = true (via the updateSearch method) + (immediate || !server) ? fun() : throttledFun(); + }); + } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { + var $x0 = $x; + $x = $x0.children('div').first(); + $x0.css({ + 'background-color': '#fff', + 'border': '1px #ddd solid', + 'border-radius': '4px', + 'padding': data.vertical ? '35px 20px': '20px 20px 10px 20px' + }); + var $spans = $x0.children('span').css({ + 'margin-top': data.vertical ? '0' : '10px', + 'white-space': 'nowrap' + }); + var $span1 = $spans.first(), $span2 = $spans.last(); + var r1 = +$x.data('min'), r2 = +$x.data('max'); + // when the numbers are too small or have many decimal places, the + // slider may have numeric precision problems (#150) + var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0)); + r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale); + var scaleBack = function(x, scale) { + if (scale === 1) return x; + var d = Math.round(Math.log(scale) / Math.log(10)); + // to avoid problems like 3.423/100 -> 0.034230000000000003 + return (x / scale).toFixed(d); + }; + var slider_min = function() { + return filter.noUiSlider('options').range.min; + }; + var slider_max = function() { + return filter.noUiSlider('options').range.max; + }; + $input.on({ + focus: function() { + $x0.show().trigger('show'); + // first, make sure the slider div leaves at least 20px between + // the two (slider value) span's + $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20)); + // then, if the input is really wide or slider is vertical, + // make the slider the same width as the input + if ($x0.outerWidth() < $input.outerWidth() || data.vertical) { + $x0.outerWidth($input.outerWidth()); + } + // make sure the slider div does not reach beyond the right margin + if ($(window).width() < $x0.offset().left + $x0.width()) { + $x0.offset({ + 'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth() + }); + } + }, + blur: function() { + $x0.hide().trigger('hide'); + }, + input: function() { + if ($input.val() === '') filter.val([slider_min(), slider_max()]); + }, + change: function() { + var v = $input.val().replace(/\s/g, ''); + if (v === '') return; + v = v.split('...'); + if (v.length !== 2) { + $input.parent().addClass('has-error'); + return; + } + if (v[0] === '') v[0] = slider_min(); + if (v[1] === '') v[1] = slider_max(); + $input.parent().removeClass('has-error'); + // treat date as UTC time at midnight + var strTime = function(x) { + var s = type === 'date' ? 'T00:00:00Z' : ''; + var t = new Date(x + s).getTime(); + // add 10 minutes to date since it does not hurt the date, and + // it helps avoid the tricky floating point arithmetic problems, + // e.g. sometimes the date may be a few milliseconds earlier + // than the midnight due to precision problems in noUiSlider + return type === 'date' ? t + 3600000 : t; + }; + if (inArray(type, ['date', 'time'])) { + v[0] = strTime(v[0]); + v[1] = strTime(v[1]); + } + if (v[0] != slider_min()) v[0] *= scale; + if (v[1] != slider_max()) v[1] *= scale; + filter.val(v); + } + }); + var formatDate = function(d) { + d = scaleBack(d, scale); + if (type === 'number') return d; + if (type === 'integer') return parseInt(d); + var x = new Date(+d); + if (type === 'date') { + var pad0 = function(x) { + return ('0' + x).substr(-2, 2); + }; + return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth()) + + '-' + pad0(x.getUTCDate()); + } else { + return x.toISOString(); + } + }; + var opts = type === 'date' ? { step: 60 * 60 * 1000 } : + type === 'integer' ? { step: 1 } : {}; + + opts.orientation = data.vertical ? 'vertical': 'horizontal'; + opts.direction = data.vertical ? 'rtl': 'ltr'; + + filter = $x.noUiSlider($.extend({ + start: [r1, r2], + range: {min: r1, max: r2}, + connect: true + }, opts, data.filterSettings.slider)); + if (scale > 1) (function() { + var t1 = r1, t2 = r2; + var val = filter.val(); + while (val[0] > r1 || val[1] < r2) { + if (val[0] > r1) { + t1 -= val[0] - r1; + } + if (val[1] < r2) { + t2 += r2 - val[1]; + } + filter = $x.noUiSlider($.extend({ + start: [t1, t2], + range: {min: t1, max: t2}, + connect: true + }, opts, data.filterSettings.slider), true); + val = filter.val(); + } + r1 = t1; r2 = t2; + })(); + // format with active column renderer, if defined + var colDef = data.options.columnDefs.find(function(def) { + return (def.targets === i || inArray(i, def.targets)) && 'render' in def; + }); + var updateSliderText = function(v1, v2) { + // we only know how to use function renderers + if (colDef && typeof colDef.render === 'function') { + var restore = function(v) { + v = scaleBack(v, scale); + return inArray(type, ['date', 'time']) ? new Date(+v) : v; + } + $span1.text(colDef.render(restore(v1), 'display')); + $span2.text(colDef.render(restore(v2), 'display')); + } else { + $span1.text(formatDate(v1)); + $span2.text(formatDate(v2)); + } + }; + updateSliderText(r1, r2); + var updateSlider = function(e) { + var val = filter.val(); + // turn off filter if in full range + $td.data('filter', val[0] > slider_min() || val[1] < slider_max()); + var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival; + if ($td.data('filter')) { + ival = v1 + ' ... ' + v2; + $input.attr('title', ival).val(ival).trigger('input'); + } else { + $input.attr('title', '').val(''); + } + updateSliderText(val[0], val[1]); + if (e.type === 'slide') return; // no searching when sliding only + if (server) { + searchColumn(i, $td.data('filter') ? ival : '').draw(); + return; + } + table.draw(); + }; + filter.on({ + set: updateSlider, + slide: updateSlider + }); + } + + // server-side processing will be handled by R (or whatever server + // language you use); the following code is only needed for client-side + // processing + if (server) { + // if a search string has been pre-set, search now + if (searchCol) $input.trigger('input').trigger('change'); + return; + } + + var customFilter = function(settings, data, dataIndex) { + // there is no way to attach a search function to a specific table, + // and we need to make sure a global search function is not applied to + // all tables (i.e. a range filter in a previous table should not be + // applied to the current table); we use the settings object to + // determine if we want to perform searching on the current table, + // since settings.sTableId will be different to different tables + if (table.settings()[0] !== settings) return true; + // no filter on this column or no need to filter this column + if (typeof filter === 'undefined' || !$td.data('filter')) return true; + + var r = filter.val(), v, r0, r1; + var i_data = function(i) { + if (!colReorderEnabled()) return i; + var order = table.colReorder.order(), k; + for (k = 0; k < order.length; ++k) if (order[k] === i) return k; + return i; // in theory it will never be here... + } + v = data[i_data(i)]; + if (type === 'number' || type === 'integer') { + v = parseFloat(v); + // how to handle NaN? currently exclude these rows + if (isNaN(v)) return(false); + r0 = parseFloat(scaleBack(r[0], scale)) + r1 = parseFloat(scaleBack(r[1], scale)); + if (v >= r0 && v <= r1) return true; + } else if (type === 'date' || type === 'time') { + v = new Date(v); + r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale); + if (v >= r0 && v <= r1) return true; + } else if (type === 'factor') { + if (r.length === 0 || inArray(v, r)) return true; + } else if (type === 'logical') { + if (r.length === 0) return true; + if (inArray(v === '' ? 'na' : v, r)) return true; + } + return false; + }; + + $.fn.dataTable.ext.search.push(customFilter); + + // search for the preset search strings if it is non-empty + if (searchCol) $input.trigger('input').trigger('change'); + + }); + + } + + // highlight search keywords + var highlight = function() { + var body = $(table.table().body()); + // removing the old highlighting first + body.unhighlight(); + + // don't highlight the "not found" row, so we get the rows using the api + if (table.rows({ filter: 'applied' }).data().length === 0) return; + // highlight global search keywords + body.highlight($.trim(table.search()).split(/\s+/)); + // then highlight keywords from individual column filters + if (filterRow) filterRow.each(function(i, td) { + var $td = $(td), type = $td.data('type'); + if (type !== 'character') return; + var $input = $td.children('div').first().children('input'); + var column = table.column(i).nodes().to$(), + val = $.trim($input.val()); + if (type !== 'character' || val === '') return; + column.highlight(val.split(/\s+/)); + }); + }; + + if (options.searchHighlight) { + table + .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight) + .on('destroy', function() { + // remove event handler + table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth'); + }); + + // Set the option for escaping regex characters in our search string. This will be used + // for all future matching. + jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex); + + // initial highlight for state saved conditions and initial states + highlight(); + } + + // run the callback function on the table instance + if (typeof data.callback === 'function') data.callback(table); + + // double click to edit the cell, row, column, or all cells + if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) { + // only bring up the editor when the cell itself is dbclicked, and ignore + // other dbclick events bubbled up (e.g. from the ) + if (e.target !== this) return; + var target = [], immediate = false; + switch (data.editable.target) { + case 'cell': + target = [this]; + immediate = true; // edit will take effect immediately + break; + case 'row': + target = table.cells(table.cell(this).index().row, '*').nodes(); + break; + case 'column': + target = table.cells('*', table.cell(this).index().column).nodes(); + break; + case 'all': + target = table.cells().nodes(); + break; + default: + throw 'The editable parameter must be "cell", "row", "column", or "all"'; + } + var disableCols = data.editable.disable ? data.editable.disable.columns : null; + var numericCols = data.editable.numeric; + var areaCols = data.editable.area; + var dateCols = data.editable.date; + for (var i = 0; i < target.length; i++) { + (function(cell, current) { + var $cell = $(cell), html = $cell.html(); + var _cell = table.cell(cell), value = _cell.data(), index = _cell.index().column; + var $input; + if (inArray(index, numericCols)) { + $input = $(''); + } else if (inArray(index, areaCols)) { + $input = $(''); + } else if (inArray(index, dateCols)) { + $input = $(''); + } else { + $input = $(''); + } + if (!immediate) { + $cell.data('input', $input).data('html', html); + $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel'); + } + $input.val(value); + if (inArray(index, disableCols)) { + $input.attr('readonly', '').css('filter', 'invert(25%)'); + } + $cell.empty().append($input); + if (cell === current) $input.focus(); + $input.css('width', '100%'); + + if (immediate) $input.on('blur', function(e) { + var valueNew = $input.val(); + if (valueNew !== value) { + _cell.data(valueNew); + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: 'event'}); + } + // for server-side processing, users have to call replaceData() to update the table + if (!server) table.draw(false); + } else { + $cell.html(html); + } + }).on('keyup', function(e) { + // hit Escape to cancel editing + if (e.keyCode === 27) $input.trigger('blur'); + }); + + // bulk edit (row, column, or all) + if (!immediate) $input.on('keyup', function(e) { + var removeInput = function($cell, restore) { + $cell.data('input').remove(); + if (restore) $cell.html($cell.data('html')); + } + if (e.keyCode === 27) { + for (var i = 0; i < target.length; i++) { + removeInput($(target[i]), true); + } + } else if (e.keyCode === 13 && e.ctrlKey) { + // Ctrl + Enter + var cell, $cell, _cell, cellData = []; + for (var i = 0; i < target.length; i++) { + cell = target[i]; $cell = $(cell); _cell = table.cell(cell); + _cell.data($cell.data('input').val()); + HTMLWidgets.shinyMode && cellData.push(cellInfo(cell)); + removeInput($cell, false); + } + if (HTMLWidgets.shinyMode) { + changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: "event"}); + } + if (!server) table.draw(false); + } + }); + })(target[i], this); + } + }); + + // interaction with shiny + if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return; + + var methods = {}; + var shinyData = {}; + + methods.updateCaption = function(caption) { + if (!caption) return; + $table.children('caption').replaceWith(caption); + } + + // register clear functions to remove input values when the table is removed + instance.clearInputs = {}; + + var changeInput = function(id, value, type, noCrosstalk, opts) { + var event = id; + id = el.id + '_' + id; + if (type) id = id + ':' + type; + // do not update if the new value is the same as old value + if (event !== 'cell_edit' && !/_clicked$/.test(event) && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value)) + return; + shinyData[id] = JSON.stringify(value); + if (HTMLWidgets.shinyMode && Shiny.setInputValue) { + Shiny.setInputValue(id, value, opts); + if (!instance.clearInputs[id]) instance.clearInputs[id] = function() { + Shiny.setInputValue(id, null); + } + } + + // HACK + if (event === "rows_selected" && !noCrosstalk) { + if (crosstalkOptions.group) { + var keys = crosstalkOptions.key; + var selectedKeys = null; + if (value) { + selectedKeys = []; + for (var i = 0; i < value.length; i++) { + // The value array's contents use 1-based row numbers, so we must + // convert to 0-based before indexing into the keys array. + selectedKeys.push(keys[value[i] - 1]); + } + } + instance.ctselectHandle.set(selectedKeys); + } + } + }; + + var addOne = function(x) { + return x.map(function(i) { return 1 + i; }); + }; + + var unique = function(x) { + var ux = []; + $.each(x, function(i, el){ + if ($.inArray(el, ux) === -1) ux.push(el); + }); + return ux; + } + + // change the row index of a cell + var tweakCellIndex = function(cell) { + var info = cell.index(); + // some cell may not be valid. e.g, #759 + // when using the RowGroup extension, datatables will + // generate the row label and the cells are not part of + // the data thus contain no row/col info + if (info === undefined) + return {row: null, col: null}; + if (server) { + info.row = DT_rows_current[info.row]; + } else { + info.row += 1; + } + return {row: info.row, col: info.column}; + } + + var cleanSelectedValues = function() { + changeInput('rows_selected', []); + changeInput('columns_selected', []); + changeInput('cells_selected', transposeArray2D([]), 'shiny.matrix'); + } + // #828 we should clean the selection on the server-side when the table reloads + cleanSelectedValues(); + + // a flag to indicates if select extension is initialized or not + var flagSelectExt = table.settings()[0]._select !== undefined; + // the Select extension should only be used in the client mode and + // when the selection.mode is set to none + if (data.selection.mode === 'none' && !server && flagSelectExt) { + var updateRowsSelected = function() { + var rows = table.rows({selected: true}); + var selected = []; + $.each(rows.indexes().toArray(), function(i, v) { + selected.push(v + 1); + }); + changeInput('rows_selected', selected); + } + var updateColsSelected = function() { + var columns = table.columns({selected: true}); + changeInput('columns_selected', columns.indexes().toArray()); + } + var updateCellsSelected = function() { + var cells = table.cells({selected: true}); + var selected = []; + cells.every(function() { + var row = this.index().row; + var col = this.index().column; + selected = selected.concat([[row + 1, col]]); + }); + changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix'); + } + table.on('select deselect', function(e, dt, type, indexes) { + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + }) + updateRowsSelected(); + updateColsSelected(); + updateCellsSelected(); + } + + var selMode = data.selection.mode, selTarget = data.selection.target; + var selDisable = data.selection.selectable === false; + if (inArray(selMode, ['single', 'multiple'])) { + var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected'; + // selected1: row indices; selected2: column indices + var initSel = function(x) { + if (x === null || typeof x === 'boolean' || selTarget === 'cell') { + return {rows: [], cols: []}; + } else if (selTarget === 'row') { + return {rows: $.makeArray(x), cols: []}; + } else if (selTarget === 'column') { + return {rows: [], cols: $.makeArray(x)}; + } else if (selTarget === 'row+column') { + return {rows: $.makeArray(x.rows), cols: $.makeArray(x.cols)}; + } + } + var selected = data.selection.selected; + var selected1 = initSel(selected).rows, selected2 = initSel(selected).cols; + // selectable should contain either all positive or all non-positive values, not both + // positive values indicate "selectable" while non-positive values means "nonselectable" + // the assertion is performed on R side. (only column indicides could be zero which indicates + // the row name) + var selectable = data.selection.selectable; + var selectable1 = initSel(selectable).rows, selectable2 = initSel(selectable).cols; + + // After users reorder the rows or filter the table, we cannot use the table index + // directly. Instead, we need this function to find out the rows between the two clicks. + // If user filter the table again between the start click and the end click, the behavior + // would be undefined, but it should not be a problem. + var shiftSelRowsIndex = function(start, end) { + var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray(); + start = indexes.indexOf(start); end = indexes.indexOf(end); + // if start is larger than end, we need to swap + if (start > end) { + var tmp = end; end = start; start = tmp; + } + return indexes.slice(start, end + 1); + } + + var serverRowIndex = function(clientRowIndex) { + return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1; + } + + // row, column, or cell selection + var lastClickedRow; + if (inArray(selTarget, ['row', 'row+column'])) { + // Get the current selected rows. It will also + // update the selected1's value based on the current row selection state + // Note we can't put this function inside selectRows() directly, + // the reason is method.selectRows() will override selected1's value but this + // function will add rows to selected1 (keep the existing selection), which is + // inconsistent with column and cell selection. + var selectedRows = function() { + var rows = table.rows('.' + selClass); + var idx = rows.indexes().toArray(); + if (!server) { + selected1 = addOne(idx); + return selected1; + } + idx = idx.map(function(i) { + return DT_rows_current[i]; + }); + selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx; + return selected1; + } + // Change selected1's value based on selectable1, then refresh the row state + var onlyKeepSelectableRows = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected1 = []; + return; + } + if (selectable1.length === 0) return; + var nonselectable = selectable1[0] <= 0; + if (nonselectable) { + // should make selectable1 positive + selected1 = $(selected1).not(selectable1.map(function(i) { return -i; })).get(); + } else { + selected1 = $(selected1).filter(selectable1).get(); + } + } + // Change selected1's value based on selectable1, then + // refresh the row selection state according to values in selected1 + var selectRows = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableRows(); + table.$('tr.' + selClass).removeClass(selClass); + if (selected1.length === 0) return; + if (server) { + table.rows({page: 'current'}).every(function() { + if (inArray(DT_rows_current[this.index()], selected1)) { + $(this.node()).addClass(selClass); + } + }); + } else { + var selected0 = selected1.map(function(i) { return i - 1; }); + $(table.rows(selected0).nodes()).addClass(selClass); + } + } + table.on('mousedown.dt', 'tbody tr', function(e) { + var $this = $(this), thisRow = table.row(this); + if (selMode === 'multiple') { + if (e.shiftKey && lastClickedRow !== undefined) { + // select or de-select depends on the last clicked row's status + var flagSel = !$this.hasClass(selClass); + var crtClickedRow = serverRowIndex(thisRow.index()); + if (server) { + var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow); + // update current page's selClass + rowsIndex.map(function(i) { + var rowIndex = DT_rows_current.indexOf(i); + if (rowIndex >= 0) { + var row = table.row(rowIndex).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + } + }); + // update selected1 + if (flagSel) { + selected1 = unique(selected1.concat(rowsIndex)); + } else { + selected1 = selected1.filter(function(index) { + return !inArray(index, rowsIndex); + }); + } + } else { + // js starts from 0 + shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) { + var row = table.row(value).nodes().to$(); + var flagRowSel = !row.hasClass(selClass); + if (flagSel === flagRowSel) row.toggleClass(selClass); + }); + } + e.preventDefault(); + } else { + $this.toggleClass(selClass); + } + } else { + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + } else { + table.$('tr.' + selClass).removeClass(selClass); + $this.addClass(selClass); + } + } + if (server && !$this.hasClass(selClass)) { + var id = DT_rows_current[thisRow.index()]; + // remove id from selected1 since its class .selected has been removed + if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1); + } + selectedRows(); // update selected1's value based on selClass + selectRows(false); // only keep the selectable rows + changeInput('rows_selected', selected1); + changeInput('row_last_clicked', serverRowIndex(thisRow.index()), null, null, {priority: 'event'}); + lastClickedRow = serverRowIndex(thisRow.index()); + }); + selectRows(false); // in case users have specified pre-selected rows + // restore selected rows after the table is redrawn (e.g. sort/search/page); + // client-side tables will preserve the selections automatically; for + // server-side tables, we have to *real* row indices are in `selected1` + changeInput('rows_selected', selected1); + if (server) table.on('draw.dt', function(e) { selectRows(false); }); + methods.selectRows = function(selected, ignoreSelectable) { + selected1 = $.makeArray(selected); + selectRows(ignoreSelectable); + changeInput('rows_selected', selected1); + } + } + + if (inArray(selTarget, ['column', 'row+column'])) { + if (selTarget === 'row+column') { + $(table.columns().footer()).css('cursor', 'pointer'); + } + // update selected2's value based on selectable2 + var onlyKeepSelectableCols = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected2 = []; + return; + } + if (selectable2.length === 0) return; + var nonselectable = selectable2[0] <= 0; + if (nonselectable) { + // need to make selectable2 positive + selected2 = $(selected2).not(selectable2.map(function(i) { return -i; })).get(); + } else { + selected2 = $(selected2).filter(selectable2).get(); + } + } + // update selected2 and then + // refresh the col selection state according to values in selected2 + var selectCols = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCols(); + // if selected2 is not a valide index (e.g., larger than the column number) + // table.columns(selected2) will fail and result in a blank table + // this is different from the table.rows(), where the out-of-range indexes + // doesn't affect at all + selected2 = $(selected2).filter(table.columns().indexes()).get(); + table.columns().nodes().flatten().to$().removeClass(selClass); + if (selected2.length > 0) + table.columns(selected2).nodes().flatten().to$().addClass(selClass); + } + var callback = function() { + var colIdx = selTarget === 'column' ? table.cell(this).index().column : + $.inArray(this, table.columns().footer()), + thisCol = $(table.column(colIdx).nodes()); + if (colIdx === -1) return; + if (thisCol.hasClass(selClass)) { + thisCol.removeClass(selClass); + selected2.splice($.inArray(colIdx, selected2), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + thisCol.addClass(selClass); + selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx])); + } + selectCols(false); // update selected2 based on selectable + changeInput('columns_selected', selected2); + } + if (selTarget === 'column') { + $(table.table().body()).on('click.dt', 'td', callback); + } else { + $(table.table().footer()).on('click.dt', 'tr th', callback); + } + selectCols(false); // in case users have specified pre-selected columns + changeInput('columns_selected', selected2); + if (server) table.on('draw.dt', function(e) { selectCols(false); }); + methods.selectColumns = function(selected, ignoreSelectable) { + selected2 = $.makeArray(selected); + selectCols(ignoreSelectable); + changeInput('columns_selected', selected2); + } + } + + if (selTarget === 'cell') { + var selected3 = [], selectable3 = []; + if (selected !== null) selected3 = selected; + if (selectable !== null && typeof selectable !== 'boolean') selectable3 = selectable; + var findIndex = function(ij, sel) { + for (var i = 0; i < sel.length; i++) { + if (ij[0] === sel[i][0] && ij[1] === sel[i][1]) return i; + } + return -1; + } + // Change selected3's value based on selectable3, then refresh the cell state + var onlyKeepSelectableCells = function() { + if (selDisable) { // users can't select; useful when only want backend select + selected3 = []; + return; + } + if (selectable3.length === 0) return; + var nonselectable = selectable3[0][0] <= 0; + var out = []; + if (nonselectable) { + selected3.map(function(ij) { + // should make selectable3 positive + if (findIndex([-ij[0], -ij[1]], selectable3) === -1) { out.push(ij); } + }); + } else { + selected3.map(function(ij) { + if (findIndex(ij, selectable3) > -1) { out.push(ij); } + }); + } + selected3 = out; + } + // Change selected3's value based on selectable3, then + // refresh the cell selection state according to values in selected3 + var selectCells = function(ignoreSelectable) { + if (!ignoreSelectable) onlyKeepSelectableCells(); + table.$('td.' + selClass).removeClass(selClass); + if (selected3.length === 0) return; + if (server) { + table.cells({page: 'current'}).every(function() { + var info = tweakCellIndex(this); + if (findIndex([info.row, info.col], selected3) > -1) + $(this.node()).addClass(selClass); + }); + } else { + selected3.map(function(ij) { + $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass); + }); + } + }; + table.on('click.dt', 'tbody td', function() { + var $this = $(this), info = tweakCellIndex(table.cell(this)); + if ($this.hasClass(selClass)) { + $this.removeClass(selClass); + selected3.splice(findIndex([info.row, info.col], selected3), 1); + } else { + if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass); + $this.addClass(selClass); + selected3 = selMode === 'single' ? [[info.row, info.col]] : + unique(selected3.concat([[info.row, info.col]])); + } + selectCells(false); // must call this to update selected3 based on selectable3 + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + }); + selectCells(false); // in case users have specified pre-selected columns + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + + if (server) table.on('draw.dt', function(e) { selectCells(false); }); + methods.selectCells = function(selected, ignoreSelectable) { + selected3 = selected ? selected : []; + selectCells(ignoreSelectable); + changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix'); + } + } + } + + // expose some table info to Shiny + var updateTableInfo = function(e, settings) { + // TODO: is anyone interested in the page info? + // changeInput('page_info', table.page.info()); + var updateRowInfo = function(id, modifier) { + var idx; + if (server) { + idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all; + } else { + var rows = table.rows($.extend({ + search: 'applied', + page: 'all' + }, modifier)); + idx = addOne(rows.indexes().toArray()); + } + changeInput('rows' + '_' + id, idx); + }; + updateRowInfo('current', {page: 'current'}); + updateRowInfo('all', {}); + } + table.on('draw.dt', updateTableInfo); + updateTableInfo(); + + // state info + table.on('draw.dt column-visibility.dt', function() { + changeInput('state', table.state()); + }); + changeInput('state', table.state()); + + // search info + var updateSearchInfo = function() { + changeInput('search', table.search()); + if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) { + return $(td).find('input').first().val(); + })); + } + table.on('draw.dt', updateSearchInfo); + updateSearchInfo(); + + var cellInfo = function(thiz) { + var info = tweakCellIndex(table.cell(thiz)); + info.value = table.cell(thiz).data(); + return info; + } + // the current cell clicked on + table.on('click.dt', 'tbody td', function() { + changeInput('cell_clicked', cellInfo(this), null, null, {priority: 'event'}); + }) + changeInput('cell_clicked', {}); + + // do not trigger table selection when clicking on links unless they have classes + table.on('mousedown.dt', 'tbody td a', function(e) { + if (this.className === '') e.stopPropagation(); + }); + + methods.addRow = function(data, rowname, resetPaging) { + var n = table.columns().indexes().length, d = n - data.length; + if (d === 1) { + data = rowname.concat(data) + } else if (d !== 0) { + console.log(data); + console.log(table.columns().indexes()); + throw 'New data must be of the same length as current data (' + n + ')'; + }; + table.row.add(data).draw(resetPaging); + } + + methods.updateSearch = function(keywords) { + if (keywords.global !== null) + $(table.table().container()).find('input[type=search]').first() + .val(keywords.global).trigger('input'); + var columns = keywords.columns; + if (!filterRow || columns === null) return; + filterRow.toArray().map(function(td, i) { + var v = typeof columns === 'string' ? columns : columns[i]; + if (typeof v === 'undefined') { + console.log('The search keyword for column ' + i + ' is undefined') + return; + } + // Update column search string and values on linked filter widgets. + // 'input' for factor and char filters, 'change' for numeric filters. + $(td).find('input').first().val(v).trigger('input', [true]).trigger('change'); + }); + table.draw(); + } + + methods.hideCols = function(hide, reset) { + if (reset) table.columns().visible(true, false); + table.columns(hide).visible(false); + } + + methods.showCols = function(show, reset) { + if (reset) table.columns().visible(false, false); + table.columns(show).visible(true); + } + + methods.colReorder = function(order, origOrder) { + table.colReorder.order(order, origOrder); + } + + methods.selectPage = function(page) { + if (table.page.info().pages < page || page < 1) { + throw 'Selected page is out of range'; + }; + table.page(page - 1).draw(false); + } + + methods.reloadData = function(resetPaging, clearSelection) { + // empty selections first if necessary + if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]); + if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]); + if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]); + table.ajax.reload(null, resetPaging); + } + + // update table filters (set new limits of sliders) + methods.updateFilters = function(newProps) { + // loop through each filter in the filter row + filterRow.each(function(i, td) { + var k = i; + if (filterRow.length > newProps.length) { + if (i === 0) return; // first column is row names + k = i - 1; + } + // Update the filters to reflect the updated data. + // Allow "falsy" (e.g. NULL) to signify a no-op. + if (newProps[k]) { + setFilterProps(td, newProps[k]); + } + }); + }; + + table.shinyMethods = methods; + }, + resize: function(el, width, height, instance) { + if (instance.data) this.renderValue(el, instance.data, instance); + + // dynamically adjust height if fillContainer = TRUE + if (instance.fillContainer) + this.fillAvailableHeight(el, height); + + this.adjustWidth(el); + }, + + // dynamically set the scroll body to fill available height + // (used with fillContainer = TRUE) + fillAvailableHeight: function(el, availableHeight) { + + // see how much of the table is occupied by header/footer elements + // and use that to compute a target scroll body height + var dtWrapper = $(el).find('div.dataTables_wrapper'); + var dtScrollBody = $(el).find($('div.dataTables_scrollBody')); + var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight(); + var scrollBodyHeight = availableHeight - framingHeight; + + // we need to set `max-height` to none as datatables library now sets this + // to a fixed height, disabling the ability to resize to fill the window, + // as it will be set to a fixed 100px under such circumstances, e.g., RStudio IDE, + // or FlexDashboard + // see https://github.com/rstudio/DT/issues/951#issuecomment-1026464509 + dtScrollBody.css('max-height', 'none'); + // set the height + dtScrollBody.height(scrollBodyHeight + 'px'); + }, + + // adjust the width of columns; remove the hard-coded widths on table and the + // scroll header when scrollX/Y are enabled + adjustWidth: function(el) { + var $el = $(el), table = $el.data('datatable'); + if (table) table.columns.adjust(); + $el.find('.dataTables_scrollHeadInner').css('width', '') + .children('table').css('margin-left', ''); + } +}); + + if (!HTMLWidgets.shinyMode) return; + + Shiny.addCustomMessageHandler('datatable-calls', function(data) { + var id = data.id; + var el = document.getElementById(id); + var table = el ? $(el).data('datatable') : null; + if (!table) { + console.log("Couldn't find table with id " + id); + return; + } + + var methods = table.shinyMethods, call = data.call; + if (methods[call.method]) { + methods[call.method].apply(table, call.args); + } else { + console.log("Unknown method " + call.method); + } + }); + +})(); diff --git a/site_libs/datatables-css-0.0.0/datatables-crosstalk.css b/site_libs/datatables-css-0.0.0/datatables-crosstalk.css new file mode 100644 index 00000000..bd1159c8 --- /dev/null +++ b/site_libs/datatables-css-0.0.0/datatables-crosstalk.css @@ -0,0 +1,32 @@ +.dt-crosstalk-fade { + opacity: 0.2; +} + +html body div.DTS div.dataTables_scrollBody { + background: none; +} + + +/* +Fix https://github.com/rstudio/DT/issues/563 +If the `table.display` is set to "block" (e.g., pkgdown), the browser will display +datatable objects strangely. The search panel and the page buttons will still be +in full-width but the table body will be "compact" and shorter. +In therory, having this attributes will affect `dom="t"` +with `display: block` users. But in reality, there should be no one. +We may remove the below lines in the future if the upstream agree to have this there. +See https://github.com/DataTables/DataTablesSrc/issues/160 +*/ + +table.dataTable { + display: table; +} + + +/* +When DTOutput(fill = TRUE), it receives a .html-fill-item class (via htmltools::bindFillRole()), which effectively amounts to `flex: 1 1 auto`. That's mostly fine, but the case where `fillContainer=TRUE`+`height:auto`+`flex-basis:auto` and the container (e.g., a bslib::card()) doesn't have a defined height is a bit problematic since the table wants to fit the parent but the parent wants to fit the table, which results pretty small table height (maybe because there is a minimum height somewhere?). It seems better in this case to impose a 400px height default for the table, which we can do by setting `flex-basis` to 400px (the table is still allowed to grow/shrink when the container has an opinionated height). +*/ + +.html-fill-container > .html-fill-item.datatables { + flex-basis: 400px; +} diff --git a/site_libs/dt-core-1.13.6/css/jquery.dataTables.extra.css b/site_libs/dt-core-1.13.6/css/jquery.dataTables.extra.css new file mode 100644 index 00000000..b2dd141f --- /dev/null +++ b/site_libs/dt-core-1.13.6/css/jquery.dataTables.extra.css @@ -0,0 +1,28 @@ +/* Selected rows/cells */ +table.dataTable tr.selected td, table.dataTable td.selected { + background-color: #b0bed9 !important; +} +/* In case of scrollX/Y or FixedHeader */ +.dataTables_scrollBody .dataTables_sizing { + visibility: hidden; +} + +/* The datatables' theme CSS file doesn't define +the color but with white background. It leads to an issue that +when the HTML's body color is set to 'white', the user can't +see the text since the background is white. One case happens in the +RStudio's IDE when inline viewing the DT table inside an Rmd file, +if the IDE theme is set to "Cobalt". + +See https://github.com/rstudio/DT/issues/447 for more info + +This fixes should have little side-effects because all the other elements +of the default theme use the #333 font color. + +TODO: The upstream may use relative colors for both the table background +and the color. It means the table can display well without this patch +then. At that time, we need to remove the below CSS attributes. +*/ +div.datatables { + color: #333; +} diff --git a/site_libs/dt-core-1.13.6/css/jquery.dataTables.min.css b/site_libs/dt-core-1.13.6/css/jquery.dataTables.min.css new file mode 100644 index 00000000..ad59f843 --- /dev/null +++ b/site_libs/dt-core-1.13.6/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"►"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}html.dark table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border>tbody>tr>th,table.dataTable.row-border>tbody>tr>td,table.dataTable.display>tbody>tr>th,table.dataTable.display>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border>tbody>tr:first-child>th,table.dataTable.row-border>tbody>tr:first-child>td,table.dataTable.display>tbody>tr:first-child>th,table.dataTable.display>tbody>tr:first-child>td{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0262ef}table.dataTable.cell-border>tbody>tr>th,table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr>th:first-child,table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr:first-child>th,table.dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(0, 0, 0, 0.05);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89, 91, 94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89, 91, 94)}html.dark table.dataTable.row-border>tbody>tr>th,html.dark table.dataTable.row-border>tbody>tr>td,html.dark table.dataTable.display>tbody>tr>th,html.dark table.dataTable.display>tbody>tr>td{border-top:1px solid rgb(64, 67, 70)}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0257d5}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64, 67, 70);border-right:1px solid rgb(64, 67, 70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64, 67, 70)}html.dark .dataTables_wrapper .dataTables_filter input,html.dark .dataTables_wrapper .dataTables_length select{border:1px solid rgba(255, 255, 255, 0.2);background-color:var(--dt-html-background)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{border:1px solid rgb(89, 91, 94);background:rgba(255, 255, 255, 0.15)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{color:#666 !important}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:hover{border:1px solid rgb(53, 53, 53);background:rgb(53, 53, 53)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:active{background:#3a3a3a} diff --git a/site_libs/dt-core-1.13.6/js/jquery.dataTables.min.js b/site_libs/dt-core-1.13.6/js/jquery.dataTables.min.js new file mode 100644 index 00000000..f786b0da --- /dev/null +++ b/site_libs/dt-core-1.13.6/js/jquery.dataTables.min.js @@ -0,0 +1,4 @@ +/*! DataTables 1.13.6 + * ©2008-2023 SpryMedia Ltd - datatables.net/license + */ +!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"==typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,v,H){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=$(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,"").replace(/