From 3188bcb78e15bcd9ccff8fb5efe19b80bbfd95ee Mon Sep 17 00:00:00 2001 From: Greg Newman Date: Sun, 14 Jul 2024 18:34:48 -0400 Subject: [PATCH 1/2] Hyperkitty and Postorious static and templates README coming to explain how/where to set these. Dark-mode still in progress --- ...Boost_Brandmark_BlackBoost_Transparent.svg | 24 + ...Boost_Brandmark_WhiteBoost_Transparent.svg | 28 + .../img/Boost_Symbol_Transparent.svg | 1 + .../static/hyperkitty/img/ajax-loader.gif | Bin 0 -> 1644 bytes .../static/hyperkitty/img/button_back.png | Bin 0 -> 3507 bytes .../static/hyperkitty/img/button_back.svg | 1 + .../static/hyperkitty/img/button_newer.png | Bin 0 -> 3246 bytes .../static/hyperkitty/img/button_older.png | Bin 0 -> 3088 bytes .../static/hyperkitty/img/discussion.png | Bin 0 -> 354 bytes kyperkitty/static/hyperkitty/img/email_bg.png | Bin 0 -> 541 bytes kyperkitty/static/hyperkitty/img/favicon.ico | Bin 0 -> 99678 bytes .../hyperkitty/img/hyperkitty-favicon.svg | 1 + .../static/hyperkitty/img/hyperkitty-logo.svg | 1 + kyperkitty/static/hyperkitty/img/like.png | Bin 0 -> 915 bytes kyperkitty/static/hyperkitty/img/likealot.png | Bin 0 -> 912 bytes kyperkitty/static/hyperkitty/img/logo.png | Bin 0 -> 19059 bytes .../static/hyperkitty/img/mail-attachment.png | Bin 0 -> 649 bytes kyperkitty/static/hyperkitty/img/neutral.png | Bin 0 -> 895 bytes .../static/hyperkitty/img/newthread.png | Bin 0 -> 3180 bytes kyperkitty/static/hyperkitty/img/notsaved.png | Bin 0 -> 415 bytes .../static/hyperkitty/img/participant.png | Bin 0 -> 676 bytes kyperkitty/static/hyperkitty/img/reply.png | Bin 0 -> 641 bytes kyperkitty/static/hyperkitty/img/saved.png | Bin 0 -> 698 bytes .../static/hyperkitty/img/show_discussion.png | Bin 0 -> 1806 bytes .../hyperkitty/img/youdislike-disabled.png | Bin 0 -> 260 bytes .../static/hyperkitty/img/youdislike.png | Bin 0 -> 285 bytes .../hyperkitty/img/youlike-disabled.png | Bin 0 -> 499 bytes kyperkitty/static/hyperkitty/img/youlike.png | Bin 0 -> 340 bytes .../static/hyperkitty/js/hyperkitty-common.js | 323 + .../static/hyperkitty/js/hyperkitty-index.js | 100 + .../hyperkitty/js/hyperkitty-overview.js | 73 + .../static/hyperkitty/js/hyperkitty-thread.js | 411 + .../hyperkitty/js/hyperkitty-userprofile.js | 71 + .../hyperkitty/libs/bootstrap/README.txt | 3 + .../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../glyphicons-halflings-regular.svg | 1 + .../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../bootstrap/javascripts/bootstrap.bundle.js | 6812 ++++++ .../javascripts/bootstrap.bundle.js.map | 1 + .../javascripts/bootstrap.bundle.min.js | 7 + .../javascripts/bootstrap.bundle.min.js.map | 1 + .../bootstrap/stylesheets/_accordion.scss | 118 + .../libs/bootstrap/stylesheets/_alert.scss | 57 + .../libs/bootstrap/stylesheets/_badge.scss | 29 + .../bootstrap/stylesheets/_breadcrumb.scss | 28 + .../bootstrap/stylesheets/_button-group.scss | 139 + .../libs/bootstrap/stylesheets/_buttons.scss | 111 + .../libs/bootstrap/stylesheets/_card.scss | 216 + .../libs/bootstrap/stylesheets/_carousel.scss | 229 + .../libs/bootstrap/stylesheets/_close.scss | 40 + .../bootstrap/stylesheets/_containers.scss | 41 + .../libs/bootstrap/stylesheets/_dropdown.scss | 240 + .../libs/bootstrap/stylesheets/_forms.scss | 9 + .../bootstrap/stylesheets/_functions.scss | 302 + .../libs/bootstrap/stylesheets/_grid.scss | 33 + .../libs/bootstrap/stylesheets/_helpers.scss | 9 + .../libs/bootstrap/stylesheets/_images.scss | 42 + .../bootstrap/stylesheets/_list-group.scss | 174 + .../libs/bootstrap/stylesheets/_mixins.scss | 43 + .../libs/bootstrap/stylesheets/_modal.scss | 209 + .../libs/bootstrap/stylesheets/_nav.scss | 139 + .../libs/bootstrap/stylesheets/_navbar.scss | 336 + .../bootstrap/stylesheets/_offcanvas.scss | 83 + .../bootstrap/stylesheets/_pagination.scss | 64 + .../bootstrap/stylesheets/_placeholders.scss | 51 + .../libs/bootstrap/stylesheets/_popover.scss | 158 + .../libs/bootstrap/stylesheets/_progress.scss | 48 + .../libs/bootstrap/stylesheets/_reboot.scss | 625 + .../libs/bootstrap/stylesheets/_root.scss | 54 + .../libs/bootstrap/stylesheets/_spinners.scss | 69 + .../libs/bootstrap/stylesheets/_tables.scss | 155 + .../libs/bootstrap/stylesheets/_toasts.scss | 51 + .../libs/bootstrap/stylesheets/_tooltip.scss | 115 + .../bootstrap/stylesheets/_transitions.scss | 27 + .../libs/bootstrap/stylesheets/_type.scss | 104 + .../bootstrap/stylesheets/_utilities.scss | 630 + .../bootstrap/stylesheets/_variables.scss | 1641 ++ .../bootstrap/stylesheets/bootstrap-grid.scss | 67 + .../stylesheets/bootstrap-reboot.scss | 13 + .../stylesheets/bootstrap-utilities.scss | 18 + .../libs/bootstrap/stylesheets/bootstrap.scss | 53 + .../stylesheets/forms/_floating-labels.scss | 63 + .../stylesheets/forms/_form-check.scss | 152 + .../stylesheets/forms/_form-control.scss | 219 + .../stylesheets/forms/_form-range.scss | 91 + .../stylesheets/forms/_form-select.scss | 72 + .../stylesheets/forms/_form-text.scss | 11 + .../stylesheets/forms/_input-group.scss | 121 + .../bootstrap/stylesheets/forms/_labels.scss | 36 + .../stylesheets/forms/_validation.scss | 12 + .../stylesheets/helpers/_clearfix.scss | 3 + .../stylesheets/helpers/_colored-links.scss | 12 + .../stylesheets/helpers/_position.scss | 30 + .../bootstrap/stylesheets/helpers/_ratio.scss | 26 + .../stylesheets/helpers/_stacks.scss | 15 + .../stylesheets/helpers/_stretched-link.scss | 15 + .../stylesheets/helpers/_text-truncation.scss | 7 + .../stylesheets/helpers/_visually-hidden.scss | 8 + .../bootstrap/stylesheets/helpers/_vr.scss | 8 + .../bootstrap/stylesheets/mixins/_alert.scss | 11 + .../stylesheets/mixins/_backdrop.scss | 14 + .../stylesheets/mixins/_border-radius.scss | 78 + .../stylesheets/mixins/_box-shadow.scss | 18 + .../stylesheets/mixins/_breakpoints.scss | 127 + .../stylesheets/mixins/_buttons.scss | 133 + .../bootstrap/stylesheets/mixins/_caret.scss | 64 + .../stylesheets/mixins/_clearfix.scss | 9 + .../stylesheets/mixins/_color-scheme.scss | 7 + .../stylesheets/mixins/_container.scss | 9 + .../stylesheets/mixins/_deprecate.scss | 10 + .../bootstrap/stylesheets/mixins/_forms.scss | 144 + .../stylesheets/mixins/_gradients.scss | 47 + .../bootstrap/stylesheets/mixins/_grid.scss | 151 + .../bootstrap/stylesheets/mixins/_image.scss | 16 + .../stylesheets/mixins/_list-group.scss | 24 + .../bootstrap/stylesheets/mixins/_lists.scss | 7 + .../stylesheets/mixins/_pagination.scss | 31 + .../stylesheets/mixins/_reset-text.scss | 17 + .../bootstrap/stylesheets/mixins/_resize.scss | 6 + .../stylesheets/mixins/_table-variants.scss | 21 + .../stylesheets/mixins/_text-truncate.scss | 8 + .../stylesheets/mixins/_transition.scss | 26 + .../stylesheets/mixins/_utilities.scss | 89 + .../stylesheets/mixins/_visually-hidden.scss | 29 + .../bootstrap/stylesheets/utilities/_api.scss | 47 + .../bootstrap/stylesheets/vendor/_rfs.scss | 354 + .../static/hyperkitty/libs/d3.v2.min.js | 4 + .../hyperkitty/libs/fonts/droid/DroidSans.ttf | Bin 0 -> 39072 bytes .../libs/fonts/droid/DroidSansMono.ttf | Bin 0 -> 31552 bytes .../hyperkitty/libs/fonts/droid/droid.css | 12 + .../libs/fonts/font-awesome/VERSION.txt | 1 + .../fonts/font-awesome/css/font-awesome.css | 2199 ++ .../font-awesome/css/font-awesome.min.css | 4 + .../fonts/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 124988 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 76518 bytes .../fonts/fontawesome-webfont.svg | 1 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 152796 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 90412 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 71896 bytes .../libs/fonts/icomoon/fonts/icomoon.eot | Bin 0 -> 7192 bytes .../libs/fonts/icomoon/fonts/icomoon.svg | 1 + .../libs/fonts/icomoon/fonts/icomoon.ttf | Bin 0 -> 7028 bytes .../libs/fonts/icomoon/fonts/icomoon.woff | Bin 0 -> 7104 bytes .../hyperkitty/libs/fonts/icomoon/icomoon.css | 24 + .../static/hyperkitty/libs/jquery.expander.js | 382 + .../static/hyperkitty/libs/jquery.hotkeys.js | 99 + .../hyperkitty/libs/jquery/jquery-3.6.0.js | 10881 +++++++++ .../libs/jquery/jquery-3.6.0.min.js | 2 + .../libs/jquery/jquery-3.6.0.min.map | 1 + .../libs/jquery/jquery-ui-1.10.3.custom.js | 4290 ++++ .../jquery/jquery-ui-1.10.3.custom.min.js | 6 + .../libs/jquery/jquery-ui-1.13.1.js | 19057 ++++++++++++++++ .../libs/jquery/jquery-ui-1.13.1.min.js | 6 + .../libs/jquery/jquery-ui-selection.txt | 4 + .../smoothness/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 322 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 260 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 254 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 324 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 256 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4431 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4430 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4431 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4431 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4430 bytes .../smoothness/jquery-ui-1.10.3.custom.css | 637 + .../jquery-ui-1.10.3.custom.min.css | 5 + .../jquery/smoothness/jquery-ui-1.13.1.css | 1315 ++ .../smoothness/jquery-ui-1.13.1.min.css | 7 + .../libs/mousetrap/mousetrap.min.js | 11 + .../static/hyperkitty/libs/popper/popper.js | 2624 +++ .../hyperkitty/libs/popper/popper.js.map | 1 + .../hyperkitty/libs/popper/popper.min.js | 5 + .../hyperkitty/libs/popper/popper.min.js.map | 1 + .../hyperkitty/sass/_hyperkitty-base.scss | 139 + .../hyperkitty/sass/_hyperkitty-common.scss | 328 + .../hyperkitty/sass/_hyperkitty-index.scss | 247 + .../hyperkitty/sass/_hyperkitty-message.scss | 627 + .../hyperkitty/sass/_hyperkitty-overview.scss | 272 + .../sass/_hyperkitty-threadslist.scss | 212 + .../hyperkitty/sass/_hyperkitty-user.scss | 22 + .../sass/_hyperkitty-variables.scss | 13 + .../static/hyperkitty/sass/hyperkitty.scss | 26 + kyperkitty/templates/hyperkitty/404.html | 37 + kyperkitty/templates/hyperkitty/500.html | 38 + .../hyperkitty/ajax/reattach_suggest.html | 13 + .../templates/hyperkitty/ajax/replies.html | 9 + .../hyperkitty/ajax/temp_message.html | 31 + kyperkitty/templates/hyperkitty/api.html | 56 + kyperkitty/templates/hyperkitty/base.html | 257 + kyperkitty/templates/hyperkitty/bottom.html | 1 + .../hyperkitty/errors/notimplemented.html | 18 + .../templates/hyperkitty/errors/private.html | 25 + .../hyperkitty/fragments/like_form.html | 33 + .../hyperkitty/fragments/month_list.html | 22 + .../fragments/overview_threads.html | 45 + .../fragments/overview_top_posters.html | 27 + .../hyperkitty/fragments/send_as.html | 19 + .../hyperkitty/fragments/thread_left_nav.html | 47 + kyperkitty/templates/hyperkitty/headers.html | 1 + kyperkitty/templates/hyperkitty/index.html | 276 + .../templates/hyperkitty/list_delete.html | 43 + kyperkitty/templates/hyperkitty/message.html | 43 + .../templates/hyperkitty/message_delete.html | 51 + .../templates/hyperkitty/message_new.html | 60 + .../hyperkitty/messages/message.html | 166 + .../hyperkitty/messages/right_col.html | 33 + .../hyperkitty/messages/summary_message.html | 37 + .../templates/hyperkitty/navbar-brand.html | 5 + kyperkitty/templates/hyperkitty/overview.html | 212 + kyperkitty/templates/hyperkitty/reattach.html | 66 + .../templates/hyperkitty/search_results.html | 107 + kyperkitty/templates/hyperkitty/thread.html | 129 + .../templates/hyperkitty/thread_list.html | 120 + .../hyperkitty/threads/category.html | 22 + .../hyperkitty/threads/right_col.html | 128 + .../threads/summary_thread_large.html | 71 + .../templates/hyperkitty/threads/tags.html | 22 + kyperkitty/templates/hyperkitty/top.html | 1 + .../templates/hyperkitty/user_posts.html | 57 + .../hyperkitty/user_profile/base.html | 44 + .../hyperkitty/user_profile/favorites.html | 74 + .../hyperkitty/user_profile/last_views.html | 82 + .../hyperkitty/user_profile/profile.html | 54 + .../user_profile/subscriptions.html | 83 + .../hyperkitty/user_profile/votes.html | 86 + .../hyperkitty/user_public_profile.html | 65 + postorious/static/postorius/css/style.css | 184 + ...Boost_Brandmark_BlackBoost_Transparent.svg | 24 + ...Boost_Brandmark_WhiteBoost_Transparent.svg | 28 + .../img/Boost_Symbol_Transparent.svg | 1 + postorious/static/postorius/img/favicon.ico | Bin 0 -> 5558 bytes .../static/postorius/img/logo2010-2.jpg | Bin 0 -> 11314 bytes .../static/postorius/img/mailman_logo.png | Bin 0 -> 10863 bytes .../img/mailman_logo_small_trans.png | Bin 0 -> 4145 bytes .../postorius/img/mailman_logo_trans.png | Bin 0 -> 6828 bytes .../static/postorius/js/held_messages.js | 56 + postorious/static/postorius/js/script.js | 32 + .../libs/bootstrap/css/bootstrap.min.css | 7 + .../libs/bootstrap/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 1 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../libs/bootstrap/js/bootstrap.bundle.js | 6812 ++++++ .../libs/bootstrap/js/bootstrap.bundle.js.map | 1 + .../libs/bootstrap/js/bootstrap.bundle.min.js | 7 + .../bootstrap/js/bootstrap.bundle.min.js.map | 1 + .../libs/fonts/font-awesome/VERSION.txt | 1 + .../fonts/font-awesome/css/font-awesome.css | 2199 ++ .../font-awesome/css/font-awesome.min.css | 4 + .../fonts/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 124988 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 76518 bytes .../fonts/fontawesome-webfont.svg | 1 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 152796 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 90412 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 71896 bytes .../postorius/libs/jquery/jquery-3.6.0.js | 10881 +++++++++ .../postorius/libs/jquery/jquery-3.6.0.min.js | 2 + .../libs/jquery/jquery-3.6.0.min.map | 1 + postorious/templates/postorius/bans.html | 16 + postorious/templates/postorius/base.html | 241 + .../postorius/domain/confirm_delete.html | 37 + .../templates/postorius/domain/edit.html | 21 + .../templates/postorius/domain/index.html | 70 + .../templates/postorius/domain/new.html | 20 + .../templates/postorius/domain/owners.html | 19 + .../postorius/domain/template_add.html | 28 + .../postorius/domain/template_delete.html | 32 + .../postorius/domain/template_index.html | 50 + .../templates/postorius/errors/generic.html | 7 + .../templates/postorius/fragments/bans.html | 47 + postorious/templates/postorius/index.html | 121 + .../templates/postorius/lists/bans.html | 17 + .../postorius/lists/confirm_delete.html | 30 + .../postorius/lists/confirm_remove_role.html | 27 + .../lists/confirm_removeall_subscribers.html | 25 + .../postorius/lists/confirm_token.html | 32 + .../postorius/lists/header_matches.html | 117 + .../postorius/lists/held_messages.html | 143 + .../postorius/lists/mass_removal.html | 22 + .../postorius/lists/mass_subscribe.html | 19 + .../postorius/lists/memberoptions.html | 35 + .../templates/postorius/lists/members.html | 208 + postorious/templates/postorius/lists/new.html | 20 + .../lists/pending_confirmations.html | 50 + .../templates/postorius/lists/settings.html | 35 + .../lists/subscription_requests.html | 53 + .../templates/postorius/lists/summary.html | 164 + .../postorius/lists/template_add.html | 19 + .../postorius/lists/template_delete.html | 31 + .../postorius/lists/template_list.html | 45 + .../postorius/lists/template_update.html | 23 + .../templates/postorius/menu/list_nav.html | 94 + .../templates/postorius/menu/user_nav.html | 11 + .../postorius/system_information.html | 32 + .../postorius/user/address_preferences.html | 77 + postorious/templates/postorius/user/all.html | 55 + .../postorius/user/confirm_delete.html | 25 + .../postorius/user/list_options.html | 34 + .../postorius/user/mailman_settings.html | 28 + .../templates/postorius/user/manage.html | 117 + .../user/subscription_preferences.html | 88 + .../postorius/user/subscriptions.html | 45 + 310 files changed, 85783 insertions(+) create mode 100644 kyperkitty/static/hyperkitty/img/Boost_Brandmark_BlackBoost_Transparent.svg create mode 100644 kyperkitty/static/hyperkitty/img/Boost_Brandmark_WhiteBoost_Transparent.svg create mode 100755 kyperkitty/static/hyperkitty/img/Boost_Symbol_Transparent.svg create mode 100644 kyperkitty/static/hyperkitty/img/ajax-loader.gif create mode 100644 kyperkitty/static/hyperkitty/img/button_back.png create mode 100644 kyperkitty/static/hyperkitty/img/button_back.svg create mode 100644 kyperkitty/static/hyperkitty/img/button_newer.png create mode 100644 kyperkitty/static/hyperkitty/img/button_older.png create mode 100644 kyperkitty/static/hyperkitty/img/discussion.png create mode 100644 kyperkitty/static/hyperkitty/img/email_bg.png create mode 100644 kyperkitty/static/hyperkitty/img/favicon.ico create mode 100644 kyperkitty/static/hyperkitty/img/hyperkitty-favicon.svg create mode 100644 kyperkitty/static/hyperkitty/img/hyperkitty-logo.svg create mode 100644 kyperkitty/static/hyperkitty/img/like.png create mode 100644 kyperkitty/static/hyperkitty/img/likealot.png create mode 100644 kyperkitty/static/hyperkitty/img/logo.png create mode 100644 kyperkitty/static/hyperkitty/img/mail-attachment.png create mode 100644 kyperkitty/static/hyperkitty/img/neutral.png create mode 100644 kyperkitty/static/hyperkitty/img/newthread.png create mode 100644 kyperkitty/static/hyperkitty/img/notsaved.png create mode 100644 kyperkitty/static/hyperkitty/img/participant.png create mode 100644 kyperkitty/static/hyperkitty/img/reply.png create mode 100644 kyperkitty/static/hyperkitty/img/saved.png create mode 100644 kyperkitty/static/hyperkitty/img/show_discussion.png create mode 100644 kyperkitty/static/hyperkitty/img/youdislike-disabled.png create mode 100644 kyperkitty/static/hyperkitty/img/youdislike.png create mode 100644 kyperkitty/static/hyperkitty/img/youlike-disabled.png create mode 100644 kyperkitty/static/hyperkitty/img/youlike.png create mode 100644 kyperkitty/static/hyperkitty/js/hyperkitty-common.js create mode 100644 kyperkitty/static/hyperkitty/js/hyperkitty-index.js create mode 100644 kyperkitty/static/hyperkitty/js/hyperkitty-overview.js create mode 100644 kyperkitty/static/hyperkitty/js/hyperkitty-thread.js create mode 100644 kyperkitty/static/hyperkitty/js/hyperkitty-userprofile.js create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/README.txt create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.js create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.js.map create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.min.js.map create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_accordion.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_alert.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_badge.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_breadcrumb.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_button-group.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_buttons.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_card.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_carousel.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_close.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_containers.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_dropdown.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_forms.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_functions.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_grid.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_helpers.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_images.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_list-group.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_mixins.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_modal.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_nav.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_navbar.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_offcanvas.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_pagination.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_placeholders.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_popover.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_progress.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_reboot.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_root.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_spinners.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_tables.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_toasts.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_tooltip.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_transitions.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_type.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_utilities.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/_variables.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/bootstrap-grid.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/bootstrap-reboot.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/bootstrap-utilities.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/bootstrap.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_floating-labels.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_form-check.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_form-control.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_form-range.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_form-select.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_form-text.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_input-group.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_labels.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/forms/_validation.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_clearfix.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_colored-links.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_position.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_ratio.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_stacks.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_stretched-link.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_text-truncation.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_visually-hidden.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/helpers/_vr.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_alert.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_backdrop.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_border-radius.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_box-shadow.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_breakpoints.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_buttons.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_caret.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_clearfix.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_color-scheme.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_container.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_deprecate.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_forms.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_gradients.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_grid.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_image.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_list-group.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_lists.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_pagination.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_reset-text.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_resize.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_table-variants.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_text-truncate.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_transition.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_utilities.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/mixins/_visually-hidden.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/utilities/_api.scss create mode 100644 kyperkitty/static/hyperkitty/libs/bootstrap/stylesheets/vendor/_rfs.scss create mode 100644 kyperkitty/static/hyperkitty/libs/d3.v2.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/droid/DroidSans.ttf create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/droid/DroidSansMono.ttf create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/droid/droid.css create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/VERSION.txt create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/css/font-awesome.css create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/css/font-awesome.min.css create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/FontAwesome.otf create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/icomoon/fonts/icomoon.eot create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/icomoon/fonts/icomoon.svg create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/icomoon/fonts/icomoon.ttf create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/icomoon/fonts/icomoon.woff create mode 100644 kyperkitty/static/hyperkitty/libs/fonts/icomoon/icomoon.css create mode 100644 kyperkitty/static/hyperkitty/libs/jquery.expander.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery.hotkeys.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-3.6.0.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-3.6.0.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-3.6.0.min.map create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-ui-1.10.3.custom.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-ui-1.10.3.custom.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-ui-1.13.1.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-ui-1.13.1.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/jquery-ui-selection.txt create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/animated-overlay.gif create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-icons_222222_256x240.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-icons_454545_256x240.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-icons_888888_256x240.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/jquery-ui-1.10.3.custom.css create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/jquery-ui-1.10.3.custom.min.css create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/jquery-ui-1.13.1.css create mode 100644 kyperkitty/static/hyperkitty/libs/jquery/smoothness/jquery-ui-1.13.1.min.css create mode 100644 kyperkitty/static/hyperkitty/libs/mousetrap/mousetrap.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/popper/popper.js create mode 100644 kyperkitty/static/hyperkitty/libs/popper/popper.js.map create mode 100644 kyperkitty/static/hyperkitty/libs/popper/popper.min.js create mode 100644 kyperkitty/static/hyperkitty/libs/popper/popper.min.js.map create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-base.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-common.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-index.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-message.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-overview.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-threadslist.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-user.scss create mode 100644 kyperkitty/static/hyperkitty/sass/_hyperkitty-variables.scss create mode 100644 kyperkitty/static/hyperkitty/sass/hyperkitty.scss create mode 100644 kyperkitty/templates/hyperkitty/404.html create mode 100644 kyperkitty/templates/hyperkitty/500.html create mode 100644 kyperkitty/templates/hyperkitty/ajax/reattach_suggest.html create mode 100644 kyperkitty/templates/hyperkitty/ajax/replies.html create mode 100644 kyperkitty/templates/hyperkitty/ajax/temp_message.html create mode 100644 kyperkitty/templates/hyperkitty/api.html create mode 100644 kyperkitty/templates/hyperkitty/base.html create mode 100644 kyperkitty/templates/hyperkitty/bottom.html create mode 100644 kyperkitty/templates/hyperkitty/errors/notimplemented.html create mode 100644 kyperkitty/templates/hyperkitty/errors/private.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/like_form.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/month_list.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/overview_threads.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/overview_top_posters.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/send_as.html create mode 100644 kyperkitty/templates/hyperkitty/fragments/thread_left_nav.html create mode 100644 kyperkitty/templates/hyperkitty/headers.html create mode 100644 kyperkitty/templates/hyperkitty/index.html create mode 100644 kyperkitty/templates/hyperkitty/list_delete.html create mode 100644 kyperkitty/templates/hyperkitty/message.html create mode 100644 kyperkitty/templates/hyperkitty/message_delete.html create mode 100644 kyperkitty/templates/hyperkitty/message_new.html create mode 100644 kyperkitty/templates/hyperkitty/messages/message.html create mode 100644 kyperkitty/templates/hyperkitty/messages/right_col.html create mode 100644 kyperkitty/templates/hyperkitty/messages/summary_message.html create mode 100644 kyperkitty/templates/hyperkitty/navbar-brand.html create mode 100644 kyperkitty/templates/hyperkitty/overview.html create mode 100644 kyperkitty/templates/hyperkitty/reattach.html create mode 100644 kyperkitty/templates/hyperkitty/search_results.html create mode 100644 kyperkitty/templates/hyperkitty/thread.html create mode 100644 kyperkitty/templates/hyperkitty/thread_list.html create mode 100644 kyperkitty/templates/hyperkitty/threads/category.html create mode 100644 kyperkitty/templates/hyperkitty/threads/right_col.html create mode 100644 kyperkitty/templates/hyperkitty/threads/summary_thread_large.html create mode 100644 kyperkitty/templates/hyperkitty/threads/tags.html create mode 100644 kyperkitty/templates/hyperkitty/top.html create mode 100644 kyperkitty/templates/hyperkitty/user_posts.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/base.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/favorites.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/last_views.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/profile.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/subscriptions.html create mode 100644 kyperkitty/templates/hyperkitty/user_profile/votes.html create mode 100644 kyperkitty/templates/hyperkitty/user_public_profile.html create mode 100644 postorious/static/postorius/css/style.css create mode 100644 postorious/static/postorius/img/Boost_Brandmark_BlackBoost_Transparent.svg create mode 100644 postorious/static/postorius/img/Boost_Brandmark_WhiteBoost_Transparent.svg create mode 100755 postorious/static/postorius/img/Boost_Symbol_Transparent.svg create mode 100644 postorious/static/postorius/img/favicon.ico create mode 100644 postorious/static/postorius/img/logo2010-2.jpg create mode 100644 postorious/static/postorius/img/mailman_logo.png create mode 100644 postorious/static/postorius/img/mailman_logo_small_trans.png create mode 100644 postorious/static/postorius/img/mailman_logo_trans.png create mode 100644 postorious/static/postorius/js/held_messages.js create mode 100644 postorious/static/postorius/js/script.js create mode 100644 postorious/static/postorius/libs/bootstrap/css/bootstrap.min.css create mode 100644 postorious/static/postorius/libs/bootstrap/css/bootstrap.min.css.map create mode 100644 postorious/static/postorius/libs/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 postorious/static/postorius/libs/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 postorious/static/postorius/libs/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 postorious/static/postorius/libs/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 postorious/static/postorius/libs/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 postorious/static/postorius/libs/bootstrap/js/bootstrap.bundle.js create mode 100644 postorious/static/postorius/libs/bootstrap/js/bootstrap.bundle.js.map create mode 100644 postorious/static/postorius/libs/bootstrap/js/bootstrap.bundle.min.js create mode 100644 postorious/static/postorius/libs/bootstrap/js/bootstrap.bundle.min.js.map create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/VERSION.txt create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/css/font-awesome.css create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/css/font-awesome.min.css create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/FontAwesome.otf create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 postorious/static/postorius/libs/fonts/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 postorious/static/postorius/libs/jquery/jquery-3.6.0.js create mode 100644 postorious/static/postorius/libs/jquery/jquery-3.6.0.min.js create mode 100644 postorious/static/postorius/libs/jquery/jquery-3.6.0.min.map create mode 100644 postorious/templates/postorius/bans.html create mode 100644 postorious/templates/postorius/base.html create mode 100644 postorious/templates/postorius/domain/confirm_delete.html create mode 100644 postorious/templates/postorius/domain/edit.html create mode 100644 postorious/templates/postorius/domain/index.html create mode 100644 postorious/templates/postorius/domain/new.html create mode 100644 postorious/templates/postorius/domain/owners.html create mode 100644 postorious/templates/postorius/domain/template_add.html create mode 100644 postorious/templates/postorius/domain/template_delete.html create mode 100644 postorious/templates/postorius/domain/template_index.html create mode 100644 postorious/templates/postorius/errors/generic.html create mode 100644 postorious/templates/postorius/fragments/bans.html create mode 100644 postorious/templates/postorius/index.html create mode 100644 postorious/templates/postorius/lists/bans.html create mode 100644 postorious/templates/postorius/lists/confirm_delete.html create mode 100644 postorious/templates/postorius/lists/confirm_remove_role.html create mode 100644 postorious/templates/postorius/lists/confirm_removeall_subscribers.html create mode 100644 postorious/templates/postorius/lists/confirm_token.html create mode 100644 postorious/templates/postorius/lists/header_matches.html create mode 100644 postorious/templates/postorius/lists/held_messages.html create mode 100644 postorious/templates/postorius/lists/mass_removal.html create mode 100644 postorious/templates/postorius/lists/mass_subscribe.html create mode 100644 postorious/templates/postorius/lists/memberoptions.html create mode 100644 postorious/templates/postorius/lists/members.html create mode 100644 postorious/templates/postorius/lists/new.html create mode 100644 postorious/templates/postorius/lists/pending_confirmations.html create mode 100644 postorious/templates/postorius/lists/settings.html create mode 100644 postorious/templates/postorius/lists/subscription_requests.html create mode 100644 postorious/templates/postorius/lists/summary.html create mode 100644 postorious/templates/postorius/lists/template_add.html create mode 100644 postorious/templates/postorius/lists/template_delete.html create mode 100644 postorious/templates/postorius/lists/template_list.html create mode 100644 postorious/templates/postorius/lists/template_update.html create mode 100644 postorious/templates/postorius/menu/list_nav.html create mode 100644 postorious/templates/postorius/menu/user_nav.html create mode 100644 postorious/templates/postorius/system_information.html create mode 100644 postorious/templates/postorius/user/address_preferences.html create mode 100644 postorious/templates/postorius/user/all.html create mode 100644 postorious/templates/postorius/user/confirm_delete.html create mode 100644 postorious/templates/postorius/user/list_options.html create mode 100644 postorious/templates/postorius/user/mailman_settings.html create mode 100644 postorious/templates/postorius/user/manage.html create mode 100644 postorious/templates/postorius/user/subscription_preferences.html create mode 100644 postorious/templates/postorius/user/subscriptions.html diff --git a/kyperkitty/static/hyperkitty/img/Boost_Brandmark_BlackBoost_Transparent.svg b/kyperkitty/static/hyperkitty/img/Boost_Brandmark_BlackBoost_Transparent.svg new file mode 100644 index 0000000..09ce682 --- /dev/null +++ b/kyperkitty/static/hyperkitty/img/Boost_Brandmark_BlackBoost_Transparent.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/Boost_Brandmark_WhiteBoost_Transparent.svg b/kyperkitty/static/hyperkitty/img/Boost_Brandmark_WhiteBoost_Transparent.svg new file mode 100644 index 0000000..0893f9b --- /dev/null +++ b/kyperkitty/static/hyperkitty/img/Boost_Brandmark_WhiteBoost_Transparent.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/Boost_Symbol_Transparent.svg b/kyperkitty/static/hyperkitty/img/Boost_Symbol_Transparent.svg new file mode 100755 index 0000000..f9c7f76 --- /dev/null +++ b/kyperkitty/static/hyperkitty/img/Boost_Symbol_Transparent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/ajax-loader.gif b/kyperkitty/static/hyperkitty/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..49b6d85326305cebc519dd8eb1a8fbe108b6f282 GIT binary patch literal 1644 zcmbW%ZA?>V6bJCf+xxWl#rF2T7Vd3(OIL0SDyd2qmMx^-i?iiL%f_59xXDBWW3W@F z9U-%7VN5EhC@1<6Kf|A^YItz~<*mOJ)U?WuH>Z7&P&*jZMdRaITF6Qs?cIFWp{c<#%& zApreXzKGeo*+)cHV@r1k;t|ZZyu({}=)lMVm=~wIyMn=3cSF1)$I*fxyS0^h3Kpu! zq^~vGYsXMg7CzFU1Y}bQ-X$MHYpV$^dQ47ds!2TsdC9?(sH%rJf@!&+CJzvZ5S6#Ms(okvlxx11a=I+S=`_*P&o!FiMvw!w~IWEDra zKBHZ3>PQhzSQUjq0ys42FoBdZWLXi`>;aS@=p>6X9uM$>6*wh^bDh`F%e&o@w1s(J zMXr~el```mBbJkad7-VoNU+jlj_Q64Wq3FfIJn!(c^2Sj!BSfmf&Z~D6kgj|2fIB> zJmig4lN-Yvck5tJvAEa#VVI$fb!LhY4huZT*45F_+Q?v%n3`h2G#EoE(IFFdmZe2o zF+iLWFY_3Ej&*C9l0?cb)Fz(mR0l-8EQ=oxtKub)epg>mpwDMy;qkoGWCnum>#%yi zt2^iedN^D>_9;fy!J#47!bPojbsK=^vcGZSpr1nv7d>e>8v6P7bTyRgFpyS`Ah5zh z6oUJl#B`RJWXVum9tromV~kT~?26H7rmcWtC{C6UHpP1GoQAk$1<))HO-7T( zTo!~M^TQIxbgBpy=wij7RV+$4(}v2mjTZFccQD!UEU zZ4!>6m_5bFoWxLdzl~-sMjAZl$mc&lyY(f*|?|eVL80ZVmEO+_Q<|*89X&t6L{QR5aJMutN_Dt3OytaEoq#dJ$ z=kDM79eM-A0|=uiRsx4Hl1g*YtldR$F-T&FojsMJcsK&}Yn^u9YLp-mBlLS2w+$MN zjTqJr116&x#MY4)w5vus@e??s>4!4G0Nk9PuY-nObzW<7xq_85et;xGxVJVp-M6)8 zz0Rnv_oh;~B?_TcM4J<|7`9wqx=FEAu`uLnW!9xVaS^x^98 zovT0e4Hh6e^;+S)(2lt)@I0JMz+cNcz6K4=UwE@QV0#cn`)YHKclSK;lqhoKsm3gn zruBy9bZrKOA7>8?71Ff$ zqL2^-D}w=~glg-;u`5>sNh@g6p}fFreemje6|Gj0#J3kN=Kq3_c>W6T=G<-lul@zk Ce59oS literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/button_back.png b/kyperkitty/static/hyperkitty/img/button_back.png new file mode 100644 index 0000000000000000000000000000000000000000..2749c2fa74d5b40774c9eac8c7c456a25f5ed307 GIT binary patch literal 3507 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 literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/button_back.svg b/kyperkitty/static/hyperkitty/img/button_back.svg new file mode 100644 index 0000000..fdf9f95 --- /dev/null +++ b/kyperkitty/static/hyperkitty/img/button_back.svg @@ -0,0 +1 @@ +Back to the threadBack to the thread \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/button_newer.png b/kyperkitty/static/hyperkitty/img/button_newer.png new file mode 100644 index 0000000000000000000000000000000000000000..0df9ca400ec3d9292fb3c52806fc67fda1920b2a GIT binary patch literal 3246 zcmV;f3{mrmP)3j40ZgF}p zWT3khGeO&`zuouj=X}5OedjbZZ|J)IMj*=0&i)1Z3p$JnP(A8L z{vP@c{U*5JuOUDf{gwu0`>T?Yk}zOOkoxEd`c-h@UlV{Z_Ifl7 zI2Z9SivZ$p&nt(+u@sObv^_*if{XtO1B8L!L}v&=?RcDz0bt==36HdicKc|5SI_{j zAV8Dw*mH7nD&21PDvZ8(u7x*R3q(!ylZkc*HE*;Ntw6t?4WM}7si~@}`VeC;e_5)i zs0inFT`6Z&% zHXM%E`}`e%?s4uB<8KK>4Gj(ZhlU1+^7C``^z>A{s;c5xplt*-{{%q0yZ`}Dq0MH? zAY(@$0-i%%U7aJJeDbj#60+P-R#wLGK-+m8RZ~;5^Y-oAUn%|6(KfV!5ON z(2)}-PG~arbLY+pKwtfoW90TdCS%#Saia%-5`C2ipu+}0gs%%lMMbiE5BVeDi36U; zQBnVx0#8iL!D4^g2vki?O&7Op+2RF=_Zqu89e~^>fSOeK&d$#4JNzR|^ib|9Zuy*~ z-@A9Ow56q`zP-J@PUZoaNi3G}OqsLfrAWT0tE($#vhPINsONnT?{AWKN%hmy(^EBB z_Ih7mUkMk8cD!Y?dF^{WV1J-k*} zt=4A>AXx`rHUXd$3LqyTz(V2)Ut-Y{S?nhpH?Erk&*8%{W&YHEUSYUY1(57ydByFI z0#LOHpjIh+?b@}T_3PJbD*dgu-qO#WJ?mlIRt$1$;lhRbqD6~z7POKDZjmzL8N@); z?Ud(Lt5%6YOM&6azJ2?=ZHe~m*&_>FD}7~TWK2lf_U+rXPe1+CD3_9wqM65zQM=6b zl}PVV0PWwupYXrNc)x7fGTq^DOaRKaKv|>8pFe+IpB$UUSj!6v3dWZ#S>kQ)gAYE? zolfUdAUO-P1(A`FQ^qZG%*)GrCi(RJz02i#B5A7bv17+{6F?chYyv>B3ZPa7oK9lw zYyzIN_V%`?8#YXZ=jhQxE?;$DRE>>|*$SZe_;~%Dciz$0ty`y!jg1YM0BYwPR2C5t zVJzH{BS*B-($dFjAqxu&$H}*;XBJ=}H#c`o)t9ps3u5fTg9i_KfGz*fp+iR5ty{Mm zZSCE=*LY^JJ$S5C1&{~;^tiYK({J@-hTUS*72xD zzsB>XO`F7sxqxy_)su}QbGmThf)4nPWMhc1-!tYhF7IVyuvRU2;F9FzWSz(|f)^fT zoJJe(zWc7u8eC^?wM&;SHPXKL;tLJvJ0h?xMKbT&#Fa2WN%!^4eniB_&$ zsmhJxIdjkmw)Mos#CUe>*x`{ik$gN`AKvGoY8Q~37+=b%Q>Qc&K>5CG0zgS-fHFx; zo=J9lY32I$Kfn_jxif%g=wcxpVp*p*@-JwtT5_weCon@b!yQ=Lqn&uCEgDM-^|R+^e7Jn zP0Ns!@0LoAR#m2@;NJ|s%p~?YhgY==EIY;$KJpj0L=FAzRo`kUJ^UTlB zmw7h4|Ni?%z1_QaYbQ^h)C5Z9dGV&B3Viywj+aVdLm6|4ii*o?Y28hMa5w~lO@c`7r!Zk@am^@>6 zhK7dPQ3s1O&Z1~|C@U_!QObw}5YB&N7cXAaR6T);GBvd2R^d?2HN(Th-GhUJZDugF%Np`PZ9Wn)?%E}6XsMc5A7Zm`x%m7Im{Whw&Jqb`BVXRor7s^-yfB+%SiHV7F zHnFlem4pnh=fb#MY#{F~NsJ00Hg;t$i~U5-Taqr`ZtdE&nmq5^xl<#oJ52y-08~EH z_%VLP=FOYEeM%cZbaxs+d5o=7mEj=VLKtmS°YERBFYCWVaxikn&lOgJ%lvNu< z#w?ctH4o-Agokyi^Oi`?PRvhN0LgfL*#v+J6+nr_#l`YDP?0aCrCqB2=%Y|CL}6ho z8IW6>yyh0YEHU9~`Or;bJ)j6cMeM2)j69*v0L1cMNyo62a&Q!*eEH><+VSJZHH*a} z=bt{wXMu~!Hx8p&Sy?(`uVdG?s&;_zsp=Py$_X9)0$+4=v_}rH0IE@DK=Rnh&!i4s zOb4KfnZ{3lHbCv*P&+2&@puAIGwDX3cuO&SG0=3Xao~Mg38O9QnS*hcxlQJKlbhIt zgeRFNVNEY7DH+4F-DZuPc-vt)?-3p~(w;GHqaD^^Q0kK=Ay|`(f@}oV*dzIPFY$I) zeAxtmO1&Q>a`5UVvD_bJWTai43ektU+wIht&>er<_+JQvI9bSQ!kzm?+rrQepsB(r z0;l8uX`V7a##YUSa!t=;ycIu|K7C%#(=PzI%|FT*BSEOE^ha4)nK#z14Vway!%-$) zpxNIxf|}prUyb>PsU;kyI>@-@uP$HCz7r7()p-ZwaK0pysCl=#CelNiSsQ5O$x;=0KF2Ywd`P zT;qkPsHm_z&^Cgae{wh+-SSh6DZkQ6f_$hbx0$X$R90s1Ieq%n;5XkKc_i-xtsm6< zk}#5!lk*5(wodt_dJ_IA8HBQa3f_O&!VUIwJs-8%Y>$JQ7aGmW%XUO(zj6P>_I-R<-OZx|d26*-VxWWbu{gl`@j@Ni0aHM`=VWGrM`70gE zf{Xte{dpIRo+%)4&7a@|9uPP#mrEA_Cl6lV%O~H#g?~-|z!U(a$yJ{aG|cU3LVlr3 zLXtqm%}tkZC(n{D`IG0Iek6Yv=y$;de~kf}{wMB$;+Vx^aq`-X3*zzj3Y3@{)ls5lA=0&U%)BQo0F5{%gf9A+HSY6b-7#%OG``tRZ>#&mec86R8Uax zU#r!62$^bRAB_>?k1;a*GDz@y@FnPi07pF@&%CQwuf7=xkev@PPRd-c0lXF?!^|bZ z-$C=0D_3k@uXh0f{`XYicDt9NqX=Do@aGsAW*!m#DQTWk@D%}_H65_oY*I2>!RwQf z0fE1QB(NE5iQ#9(4oU5Wg@v05;=JjE!{PX9tZcmT6EZOP8=8$&(3zW?n-6;~#_;o_ zsHkWI!TaDv07C4R@&o=bkqn8y<3=)a`4ukJv%e$E!Iy(52a`i@oxgJn#r&( zhM9xL#>SMox>`Lh?gIlWS0;8_ESI-UMHelCyg2otnG74J3ze0XoBV$N*Mi%(Z-4zP znd<85FOW9l&h?*#>({UUPpwx|Q?uhmuNMyZWtXxCe{GI-{;gZLwhs*S2NM#O znF%4UOzw(S7un$$^J>gw*cvHnYikb!KdGsYr;iaD&-Rv<7CW2zLhiG{Z>(0UwqwVR zU}xV;YYim|#XJ?*(!0(eWPSW@MXghcA3|_l- zt#3Nln+nRx$^zn_?Cfj}Umlr?j_&U6qU`Lf5E;e@@i-?Z`Ga@L)ujJ zKnQPk_N9r0=p(o((dfY^mGB^0kzsE*5ahJer%#W{Cg#kUqaQeMAV_8iBqk;rPJZvb z_w>7W@A{EToj?X-KH0-cNocCCufIJoFi>kELxbFhO#4KJ%u>hStBBEz9@kRS*N zWD}4=qoX~CLsD?8UyYwRbH*5-K!!s&wr1_xwMH-`s~kUmTr-iOkrI=F^Lmn#lSAX8 z^TLG-!Ta~`XW_8)&6_tH_rCr1TYbTT1%?b|sLO04X*XcbSOSsl?d`px$Z+`ZVg3F0 z-#6|hBqV6`FFi7s)ZHOt^XJdk4<0;d$Vzr0uug(E`tG~$hIB4pzFdPukHv0+;hQ&a z-ncavEm|bDjS&1}5b31D;duJaJMS3x7B60`@7=psH<95&B>tZakg?Qa$sR|DxY4s5<%ZPx4c_Nj4#Wm&gwoe}&kTebvA&3R@raJth8fN{Na z=~C^|rAxu}>(}chGBh)%QtrvM5XI$k4addB8P^y(g2S>1Oi;~XJ?-SllR77^!)zmK z4eZ;u&yZQRY?+>!nW^zC9qj4pxv9t?L^yHcg!aiNpBUFij~>;q;d{vNNadGSxJA`(4|cJ}Pq zpdzD?fx~kt690z-8K*2aH)kRth6(Zy;pUc@$rt>x2xNA_M8stpdwhK~B?InXhzlGFvdl&@HD2XX!M1qDwhY2@Q>! zbNWO^=I`FU+gSJGk3Tl-5=c)XW7ypbA&QV45R%IwFq0O&wWQ!7`CAAVIDhw3=`XP#AaBLAw3)j>OIvs%Ek$*FfJYTS4qDh<2092 zCTwOhP+uz~^~yDlc_MRof_Pxc3~gkBAypcr2Qg#+{{0&DyiAdSlPS$=#`Ek{WLUFi zjgY}9WAp-{o`F8+sf_VRHK0;H0WDEv7ecb9YLOvud6cK1O8sWLR;*Z|k+q&c$ky4j zXB)O}+qO-UGNkrKzaeiwKUJ9o5|=~b%(S#Lb7shk#Q%{%_TlrDYVq+)LS#rxj2q3! zNViWmkG*G_$&eKe1kghU&{PVhYk!KfI%p(Ay?{JXkh;f_fq7m@>vGL0(_n8M={sm5 zLp$lcRp}sr0cw0>Utgazcmb}1b#-+fb>d|1WOh=*29)y&YAdJF51A?z86b<0A&Wo` zn#fR&LwZ#sJVu5r2%jze(O72ChKGlHDLD-^z@6+>=c%ZPgQ1O;NR9qMGC`rPL zX3j*0=h{f%>&(rbq<08-X95{=$qXSf5TI+2;jtnEB&<>TAmamMbahY4kIHlepn=A> zSNTAELsP1o$k0Yss!+CzjFcFq4>D-Tcp~-xBzwN$cDwM|ViOVK16f&@yphbOFY-Z# z3PlEcq@e!ZA=Qpb?Ufge&YwT8;gCMMW?9${8H!<=QCm6nhHgm0P|1j75oxwKc>y7c z$e>S}Ks%?u5}9F|J6&oj=~g4fjxyeY!+ZqKkVjW=GW*01zA@K)U zMAizZ-U70;iVo!Jq`dJIq2aqA`C?(jsGWt(&Klz3UxCPl9K)txO_P~V!f2< z8vKx@$l!?<)V>lNU(U&ocn(>hjI>!YnGE-fA=Fg}Ryq~CUL>$zUY{t3AjQwwTk-Se z;wP`nolbio?R|$Me;g5L7y~>~Rz{=8X0tsozvxsJ!^{FiXe=nOjeBxfwJI@?n|q}? zT3uv?0rShzRWZyQ@N=ubzn`a?xDXLO{4gnCvswMo>Z07$L55oM8&&=oW)A368qIHE zuU?%TAWPhviY}|w+8%lf8&vHHyyeuwSo>;iV+R8w9U0KRmbbNq%pe!C@5Lt8c`CQpH@mmtT}V`<;yxP|-tA7sn8Z z@YDj(=otu0OEi4`W#O#RXH2KCm~4=5_nu{Aus*=amrwL2S&*g53hD%z<@F z3eJ@}&DAfT-uT*fpWWf_l^jCKA1=$x4~neukc$6c<#I5yvr+Ea+0}oaOZ8W{N}5|7 z?DF9kFk*kO`1ZNrpBM7IQ&tK5=b3Tk+W(7LyPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyV} z2^%+99}oTj00EszL_t(Y$L*F)P8&fGg{!K&Co}ykXTj_d5?(=+MA#-)Y<@PmOb)^A zEPLG2EWGk9ys+>vQ*1~ikP{)Bkw8%ER)4DZ`c)S)GqhO*Emy06>2!M1DnKdqt5pCq zo44)32jF!8WDDWS5wWL~8aGYT$9-o}S(aH=rCEV*nTs(Iqn7=v@K>T3;~_KmiRij%nr@n=8}I$z9c=Yru~?|}dVNYn zLqr@gb8d{OoO5PZ5B^&*#!g+=XHv>BGxvx{I_HFQ?vpVFgb@1ywxsothz3M-#mwC# zNjBd5%vvj+%DH!vm&;|cTCKhS!1*6JwbmQwoH52AzVzBsmgVQFs?HE`gos0Ib1#Z9 f-h6yG?*MQQcpRNDVoQ5c00000NkvXXu0mjf3%KHG literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/favicon.ico b/kyperkitty/static/hyperkitty/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e2e3ebc9a01ef96426d459ea35666904cc3b1749 GIT binary patch literal 99678 zcmeHw2V9idwK#6croC*kFUk8SFIn^QQeWC8+obp2d+$vY6vcv41VKR*QACuEA}V$e zvCx|!MS2GT5eouhN7On0b3T}1W|)CNaI>4t`Tb_@cY8VKwsX%tS3+Wm#QPFI{GkMz zzmiz~o`i&%goMPeel=-7j_w8M_Q@wx_TNfKxcx*zLP25D{s$!qi62NyNCX8<*}uI+ z;)?(Yi9cW(7!^~TbVox%0@F!DgMMrP0EutXPw&ew|LSFDpWte2ww%gsuWMkr(cL4_ z!@xjuu6kgdm&8Sc*Svc53ew`@`%EPzzjI(mL?hXYF6IpR>uLO+(oj?T>-UnvH~C&T zmU#M1Qp~ZqkWI0Hw#MpyT1rdns;eGg7`Rqa^3+yN?td~85*o=)kgzRy%gKFPb~IPy z4ZeOk0W1~^Uc7k0_;t56KR&!W{CaVA7Gp2Dm~+QXSNFRKJ9lP~!-L^rxO6mO?B&E{ z_~zzjNJ~qDhA%a<=hPe%*f>}mpXCwTSpB?P#-7U3s@`_!#Lxr_(?-R*4vcr_fxL z50zI-;YLdpwG-=faw6+o%%1X%+G*m8D7RPB^k}($eUR*9qa!bKQ}z$#q$iYB7hf9aX>E9Z z=jM%xE60;NQ?_l+_BGK_h<3Ggi1PMa7q)tJgq^Ogm9ebyU;S5j9^JOeb9bPrzG0l3 z+xwUlQ!j5L*`KYq()xsL|9YAdSXTT!l#p23Cn51|_Q0@&S{BC@G=io~w%50|OvS-? zG|v1Ae+u}c@rwZ*cr-B%{n+sJtot`>>=U=)-1tIzTVndD%7>bonjd`C?PVw}eQ<@T z`JEM()?T5GGT;ql|gOqlM@P6)8G>0dWTTWodE_bcr(gUAQ@ylpE9xq*oPI7SEVtXx-~b%hy6Ik!ol&>D zx?*x$Z8f(y^L;Qh^uCjf%&*ZR;i{usH6s8zByZo^8|7f|!&HC!+`QAt_xQsQzFy*b z;l_;{@Z`x8es6e%bL_GGd&YyEtf97~h{r$N)1w6)n7UajDaH48bg*~=pyk-^?Jtf+ zY#ey{XpG+rXbsfS(E<7S`Ot~$edieZ1k(=qTeIU}MRw zkx`R!y6hhqj+1{hj)~zbmbYI?KMYqdUl5oCtyxF!--V}BxTduy zj;XM8=~5>A*w8KLs=W-IHF?l=y%5Ik-w~M3U0i>9&1%_UxXoK_l`zoT1@FKAJ}3R({N^{% zQGS{eth3@QxHvm;{3(B0E8lFJ*|m?y#l5gmP}+x)Id!LRKTVAz9W~XjIf+hvbT^bh ze}6x`_uhL<`rrNTcLC>6=&#R(r%xx_tF!VvlosW4^3TrBhMPBUV*Lwwl54E4X06fF znSpx@#LN}D?X7yp`NoodtpBseW3Y1NN+x}KdwY2J@FBF7p5XNNTb;Eq(2x%~IXU3! z>dK4>uV250?)nl={teYt5bWj(IR~Og_t}}3?KU-K_9&D$`?pm`@ozCMR*#48407T< zMB3_aDrW4Bjg3%OR|k(D+=s5J>3%|abyQ@*-JS+`hHdir;Ry6K6vGpw9fHcjeAu~m z6|m{6Ha~AXz|5$ddyd;>sr%ztTeJSEbEn6TZQTGR=TC9Q#KE2>AUYVm+Yk5pTA-^k z3;4&y*Vy+5yXv5)_6qc2|9FaRMsOr%52WplWcHkl!_;5trAyD9R8*L8(CyPt-}f`n z?JhoZiZj1doI46~*WJ0%1b2E{VPb0k#CQn#E6u$$kr)~P-OWt`L(m?~ zUR{F*2??AFBjZB0&X`0d#-Bq$Mm*#kieeRCIF4oGG>O18$+5Zi+Cm>f+Ga>+U!v!yLFY3Hp=CsRjS>#AQp7`h8rPNh9e4BgNg=4E?vt%>SJ zB-AC8uBbl~8Tpg$`i7&M934jj>}-dEtSx$iEKEu_>uGEW(o*<;{OROGYkqLhOXqJP zcB<}y4q6eu=E|S*hncS(_v|0pNh|YRm)2|5o+SHG}KcMeE2?+@_CwUZ%`7Q+c$^#|L55%WH z7OI2;{y2P!-$+OdV{Y_g1I81%Ka0bP+e%CWVj2+Bz}KG!XxP{N$L9{ZUrJ`{E|aO% z{(M=A=@)YU^G(2=?mxa!zmmB;)X5EG95}$@|Ek7#|;paK8YSzNBm;fB7AdpQ!(tkCi z%S-Zy`zq|q)z#Y@uT^sRmY6344<0 z6rO%o@(TBd@6KQ&bHdZd4iDGSa8uI{DLngkd8h67V%HiSIvVWwps6$m831$h04Oas zJbgF@Y0*2L2iqAu@;B8O*l3_?vs_s=p!DK2|Arlw+YE4Veq=8z%b|Zu8M%ha;%R;o zcUboKsf4(3Pi0vfv}5@tmSp&wZ8^Hd_D)ImF%Dma9rjJks={1WkiE&%jYb;Jc6ocg zqVsxTu-?S*zPEwF57D1#OG_!KJ^MmJCmD7^B6T%2!a7~e(RD03Xq0$c z!hre?$rBJXH8nv+MFoc^CoB%R_cS#CoeKoom_m1B{fwZ*i`k&3MG150z(rYE*2mKF z;f%ms4inFxLx`>Joisnku{-_UTs|{DiC0)qP{8ogi;$Lyk56Owv17;J?%lgHBM5N0 zeBv0aGth##;6UUxPoGm6$*7~8_%)PR`tJY^?4&9NJFwTH%$PS`O1hlPa!oxPBqjf26#X&$oBg!nxAI@-ZaNeOJEq_&~gjPjG4mx`j(o=qE> zx%(N8ZTnX^LUVN`UrNHQL_2hL#6E95ckUeg{O3Q1Pe1(>_{;oY_#O=2Xn}jTdf)}} zVnu;YJdbjgQ+Q>yY#DRDig9Mt!^c49YD;z1t9{Fzp;JKr7nILq*$^5To2^I8rgHzX)+ez){}F)S-7S)uD0Q(UKP z&{7*YvoDH2>I^%bA9PgUSx{vr)E69s*1~k?uD%ElM~9iPw0@#;)3`%8dHUoLw3i-3 z8L4Xc)1Ust)a^$<`Vk|uHPCq-29U=;7d*o=6bBjk*A9{jf55Oa+JBq6`p?3Q^d7Tj z8QUq3M|93{^$a{1x(!%orYv;+a zF2zKq-C9wRTe@@2)0Nr(k zj49~vDXx#*lvQ7veI{v%{ygPo+czmH96TJlb=LLw?HjEye5(sCT(}^xEZ_hB_u+PD z72Iqo=M-aP=nixgr$J_BCQlraF|@?9a~m64TH*Ske)2qy6Orp9a^1R@*0OSxsKBz5 z`z|%LKSbzhJ%1tKyqBHSZ9H=uxzh(NEiF7{p>kVWTLZQK5T3>LH59U=;21d$ZTU%X z@6Ijw^Pm6BiRbL>%+MKo&(u*{z=^~CarEE;mZysHv%|LL0_h&Za_Y2BRqy4O<&eb`^QfzCAtJF1v@jpC8a=CWnWIP$7v!*`&s zbtWhMWJ)ru(bs{jeY?lgoh+Uov^FxqbUEb}^c|?He)VkB4uP8xTHAKkTw#hfGBN@t zCMK|C$r481lr8t#SCb95@jQ|nM(zzjM^OqqK$C#_G3#Y-Wt*j+3^3ANZOZ z!TqT@yRD*}6=i8W5umFnbRNd|636Y#f4A2{e=Nn{2d7nBw(&u4V=3If*~W3Db5mM7 z5HPe=n8qm^ClG$z>S}aAPBU#=E%0N zJ%?`gL!hz##0q7_9q2X#5Bn^Q|Bzs3GIlC(a3w<5aWuJVhC{p&De{jnsURWDeGUxNO+Yj9+(Eu4%A2kv=|=%~N- z8Z;H3fR3_L&|Y+eIX@qrq7NqWJpWD}PJtk2D`=>g9=n7kaXcYm+)`Ga7VAv;>CAtF zj>cf5yUPpy{o6Rs{ke&eaCEZ+v{lX=BS`k<$zxvrg|K`Dxz}I2$_jS1f%KiBFx%M2 z9rxVfG#2vONYI=qKjI>Bt&Yyir+n)$?l?~#j6l}@t#B%0HJnS`$0Awng}~6Qn-K2h z_;8h>YSmgTg`ik_eOz=hk=0&RgtGW;FpO*Kj=D-X9=-MXp0)N5x4E0$TxF!1>}RF4l)DTI`8JhQ z_>HNw+)E#O$BFozJ6R_a5+G?u_^Yk1E{}sP&Bk_^8$H=&Zg4ZiKr1oKNP`wD0^5t+ zNrv8CPsYvHPCF^oMeou!XWh~b*6K$sV3W})l^cZ%t}`7 zn!TLdiPdTv$~Lc#c_qxg1BwOZ6l@uF%7(B8ldE9KAN}r>ch!+;~z|# zV`v6rDq|$gv<0A#F<;3urhL(oNfTv~$o&`iBa<#|l1YH^89+0LKG-Ja!`RU*nsV>s zHZeY9=QlAv71!14<9+p4M$2TLqI~7|{}tQ7N>=uWySm1!#MoG@-XxHm z02^ZW?*~gc<=2{j|9ls^&AQ(qxl>EjMPehX^pBvRpm*j9|IhZfk(6{_siFRA2+!i^ zjyD_FcMj=1k7S3A#U}vrlE-yF{q(#1WmZs7c+YT|OsI*Z>_aPA1+bM<0Ob3FlY-)e zwTx_yqnw-+f1Iz2-9trrF!%K2-CjXw4eYbb#}6L?)y+&+QJTN(246^Lm`cgAV#C5& z?I@2E9TkP=h@&VAQwXm5`m9yzYOn2NWWxC4{j=@<2Aco7PD^8gfOc*bdOyn-N#@|2R>!7Lqiq4tY{fFImD9)WbBq9uWm-sGh*428sSxfa3w9Yz) z2=ga-ZEpifgU!~;CwIE*-ilsfFuK>nU^v1>Z(ysvW~0A_a_UZJZHoiTb^cpe8r<$~ z$_i&QQb z|8JPHdeS~G!=WR-mJ_LguH#qIV_A25JK#Cqxh5S6-Obmb;?h|-v@>8LV!7G#Xm^9x z;SRcwd`(p@huLTuM|%m@LF1{SbpBGtaqc3{`t9f9GGQhuNe#v+zp1qB{S%3zw_%Wp z!T2gQ!E#pI>8>-8QHWk;(0<(Ca{TmxkQev+J9y67XDjH7=cuczEDz%SJYVf{)MJI& zYESqYsay!P(vsuOW0jgxR_ma-g_iFhqEEm1tipFV-w{2Yk#c6qtoTAQ`WSpD`U165m+ zDfCd1O}=)FzZZ=U)V}XxuRtn|B^DbdxMC(EE=@bRKsQ+brLG%q(R@w>vWaU z{LT8$Y*s-g38mS_piBh={K+i)l>kQHpM#qu>&f9Rzqd+~5Y*h^89SgWJ;Vx5M@ zUokwV>;_+ak+{LmPUJKwuV5qHyX-VhtTFx0es6=)^WhFJ+N%r6`>n&+{UJ!-9R_~J z8mtWl>ToIj5XvphUWMmKN4`3mFM~`?zl8lc2eUWaLOji{Se8>yVL=!K~5PVMH|_qfF4TJrS@`Uk&`N>25%S z(5Th9mtmELDhYXU>Q3JtGBQ8%P*!G*h$zEP8SJt#d9=+zvpB=gX5wzoq|6+-&jp9^ z?i%S*ymsvxBXdb|Y3b?d%({ct93deg933fhrN!-ktGf%fI@!QlZB>ZgypiW_0Xtlz zm&XftMcM6W=czy0@t$0J#(@JOb=cb|`w_pwkdWTlW)&@AXU&+^sI!Y?2-!fg zjiir=Et^N~q^pQz;^{7eARSTcxPnYt1LkHNg*Do0uv%LKDp97E8$wLdQ)yHq@@6_l&xe8}0K}Yp6eJLAn$MIY*Kq+0z2< z5A+HPGN(J?mG)w!kBi#H#l?lu!$tRM*zH5@uuz~q&ylD|@K91jxjPrwhH^qSpZ)ds zn6AM3le@LFq<4UYnLvU*9lsxvS6aiQ{Dagg+q zk$x@;yBJW8cLv>XAL}S9chB@sf8rVUG5r~B;iIK~uk?H-&p42ing9pfEaABTy=tPC zk@gT&KdKvhKT2cZmtTGf5fKqgTX3gE_Zpsa-MQiRo9}l~Ru;J6e%@A6CJW=vs57^l zqwJUe=WnR{l)VoqIDQ18>`j60{44}$T;m49FUd*c0W|Z|(b3`dX1;IV?1Ap<`OuE{ zQaVsyR%cBv+`HXBBb+D>r%`Us33-CHlCts`e%3Z{Qk0DdcXfPvy9f2fSs1{Ru?M1L z!4rmfE`zwgxz*PVBg6MOIA;eUeZ=g#llg-m{DAF+a^vIBTzVEd3zDFzG!ybKo<$u^ zWhmQx9ony+gVt+T7(Kk42qJvY{p#iFny)RtlqThdv(}&dSE?!`gz9OqD$bu1A@%7X zBx_4|C7Sb7@m|6aXfH^H_S^%|RFDogyQk+qn)95ToS1uHd-v{z6DLkEiBR3!%CYVx z>2UVc362gmY9o@Zr#oaM>)lwI&2tZBx&*?%E@zwo2jmIcp*$jnnzar573H@_SeS^$ zRGG?>?pZY#oq!wlg^+hC8_dkin0o-Ev-xmbB;qpxnyy|HUO@Eet}kWe*pm|Cz{0|U zheoIkNEh@l>bLI0yH1_;WwWNm@7dYV$kg9nN>&^Fgw~(#{O!}bjNw=>b0c!+l_tiujy(I<~}!M;JJV^4*m90a%vcQ*7}DiE3e+JuPZYCNvC6T=^3UFCr_T7 z6?Z@W@sHtVYZWvX9+^>S(!JPLoDNs7UKN@K-N_?;oouKt$z*>DH3#tSs;i><#=PcZK;{T?;F@$q?Pkt;s7~#Fs*i~1A zcTEm6eds4Y`N@oQvTz-9>Cz=IG&E%LB3-%-rL?3G4s>5+qlNivXLT+)nHX+o)(lekJ}@>Q{7T_mg6QXE6Y>%k3RZ{nX75PM|+&R13l1oC3eR8mhjn> zo5bkiq{Mda+zH?L&UZLz>7lM#Zs^B5r8ioq&-l3gsP1tg!LU+Q8BRs+czxQ{l9g&_ znj4GvMlhU6G!UY$9I)3|`*ptv_pO^sPIK-j)4lxv{_p?hl$-FsZ{I#n@ou6X+~(Zm z8EZlcKx@06!bBLkM=W-{*M@1GJ$n|89z6=9Q@WVRo$d!U7M~KRSCr}=8|VjK>Z;IG zIXTyMR+hs-8xGP+|8E@c%r_SugU+&J%za*df3j2ENq_H+mYI8X z>hC*NuLN%$4d_808#g>co?(Qw*~<_^?dJjd)4EwOjL^0?=4_$7$5gxLptT;<=L+v@ z%-b5p$MHVo4el&weABxd?YVI2}A9_&Us=xr>6`*#PCAMzOW@QlID zjvBm!jqO)g!VbL#BD>%Z%@%4HwjTdXQRQ`g_LhBxH zZK9LvU^a2Y&E{3r>0^-OXb4$Rp+a@w(ELyH7wJFX2cpT|R$Q~@AB3)^+3$i=-0|nn zfaZfXY%3ZQyD(mRUOcoEXFzXTEr0TW3h`m1kv2qbSPK(V_eEy}nsRuKZLrzg^p(4^ z@&n}i{ScjJv_XWap2l7a!-)fS=C2-3={6okJ@JX2HjwIV1NUxBpR;r4bNAK_Xhu5d zMBN29@y_pHcLNNd9^%fj3|#k#R(J07o+8hh=9htOL z_F_0r{e5&5e!N~&Z5ZzqvigPSVWxB+qptRoVe8=ZCMzg87K?pCiL z4qL1Ypezg5o!GbL3nQre-%(YarT>K_F>*QecUMx%@>W-aiVLFA(lGKuGs3*#>=s+N zd}JTI9Dh3BqKF*+G1AY0K%bYJ%{87IOa1*+thIi{QD^g^^DAwiWqa9=A6;ShEP0K` z)AX$YFEUYw_ob9XxO6xLE*(jO?9>!E5xXBkJw0E#X=#n4oD|DUT5i}>M&@I7{cYtG zwVV}|VDH9_BA1CB@EPha&q>}1XSO-P`Ms-I-PL)EMiY;)-ie{U6Ct)b<8~@iNp$YX zE;HLK3<`ShxU2c^!gN(F{k4?0Z_rdej`~)L*J-KMt<_ZP@>EmlaaB_6wvmy^!?(7g ztYj7SN#=(gpG=gOyFl_|!}B-?!g!N_G5ioCr`I49P@9pn-Aw>7|}V~MQ&ek-2t@-TU_+g<rS1{M}boXYR7n8*GMON}t0vU|Gv50QCh|C1u=0sKOd`HP%`UwZYY@iWfF( zt9eBk8~>U+?!VGE%7gtB+d$4%PD#m8PDu*iJoq*81bN1af2I10>+<%-RB_vi+g3~i zVj2+BfS3lvH1M^h0YuGW!T6TRl=_xVnnfQ@nn523vM-$q&o)2A(h__yWnxtrSTbdw)CYl1Q}H?aAo?c5 zP3fNqT2e%IY?~s9_ZVFlMH2EwwBcv|&>WM;zeNPn6A?stqOJ@k3t2EHL};HIwrGZ!VLKDwLkg8C|s?2QIRIXNC2vn{BD zfc?oaNq52D|MC~GkX2-80Ox`Sbmtobh-u(!-Uc*ZFIQI1_fSy*cl=f6y?dYH3Dq&EYb7hc%|>1^!cIXc9Nit96cj!q z|AnM4jtdg&)YN{uN>ycIHR@+Nmz2nZR_^zjcs%$lq(hK&FtQp?3JAbt$b)oN$gpy-H8r6qQq#E2$}o_Z+-! z$ls>I?A~fB(Q7r-A;{ithVE;6yGj(`*Tde?*o1GQP3;$D6&!@+&F@Y;CVX4+H0cYX zJtpCv(xE*l?L!FnlkdkdxCb{}tKhr^D{#)jw??k7*3kHzKTWY+I9;q!SO3UILv3Q6 zChE0pYQ&~m9C(g;`KiB7@(mQiF;$-aEyzyqDBwGRMZ`-Y+|&3Gyuu4I(~dxQODnkJ zn--axX-QDorB6DAD zP1xb#j!m(+u-e3op#gjw@hql1EB=EdB;GNRlsQefC;sAc17n8Iz+EEJ)0~o$!tKO- z*WvpY*1Ec=d(#}&;5g=^i9ZeXOfP(^76Z(h@4vhMYBlBKn{~9HavnN9XCOd`!(QYU z*~uy57$Dy@S38?Y$=a}S@2sr{4z_kPQl+r7#FF_V&ar8%F@ zm97;PbMh`P7yT_bdIyUi3h@2bAboAvtgSJ||2CtrvMi?inLx{*o$$BtNL*u(nYhNV z|L8{ZSBQT=6Vf-B!IAZ5aCn_59P%-R)U_sn_y@#4ApQaI5Aj|`5WB))e2=ScZLEi3 z^#0|BcKh57IC_N_qpZRD+OKxtn|5yl>JfizUa}MJ>x7lpOh$GG;hy$-_wU^06ovGC z)B8UQfv6Sk5Mro<2R(Ju}$)*9TYYZHrs2e-rT!rvfbDq`w8E`WuG6&C@iL7ou1$_(N>jo`paqyrB_ zK>S0Dy8-NS(!I6INhe{Ci@sr$v;GekQvPj*I;_Z5D;LtlLgO~$9u0NjGkf$kr~_A6 zIZ;3KDZ;&-vdRqpgV4l9^tj#K1=|dDAy8M77?y8k9dIGk=A$!#7Ms(3P5QEet>Ijd z6`TpQf{g7epyW&n;uz1)aE zCg0zgGvRp#*zMs8JB;-p%vgI-bt_*Av;E8A4TfhjgRNd>hghSodP_JOx&q&6I1ewL zF6>=HVO6}>+Xba3Qy^iT1A~9;|FGLh4-o%=_=g>KI+fveI$mM6I*hJxVQo(CK`7g^ z%Tynt{U+C3!t#7m_YUL-dm>+ErK$?4tP?5^f@6OQ@rm5DX1>+L#?#m5mxUAW4%}VHv7JnvXXxHRmht|zU-`HueF@~ zUg8xxtI!i_iw}=SM}X+uM@^vsQ-34;7wocs=X|J@)45=a;VV1r;BvSvoZICEeGO%c zK4;Ch1!(_!v#k-Xr0$2P<>oX75dH!24~TyVw$Qw>)l$n9-*%tD4+}NWdK%+P-D2^f zQ&y3c?)>8T@1ahY(BL3!7>V2bpR5ZZXy5tQq~a z)rO)xmoFqsp>fYACNjKO#D6jd5{iH9`|C)~jCe)tH;jcQ`i35H0h?i;g&{~V= z$n(+MmF{u;^SKc7nvy67DBkS=*?ZQ&*qvUH^ZL349LIO<%FZ3f z_u0%D{BJSSq_F_}j5J>P>Z#rdvoLu5Hp(30?1+4LP4Ly!RKoOy_J5S&_yhY)x8Z8V z+b9b2PVGK?b9~)^k4g^$dTaM3|h<%w$#iFvKT3jbb#DlPH+?7ivCvxIwz~iy9m2I960#jWS|bd z`s#3c{~maT=j#iF2lx(PfSwk+~fOp_99fDopu&1obRYZ zbINl$#O9|Nz9tv)!|Wg**Y)Mccf+d}&nfu7JkVOJzN7%6JY9f|{|$O-5NKr#HThQ- zRR6}}BG`hw_th#&yD=e7dkgzUxnn;!Zx<~qUZd~oz4eZ zKEJXJ_j21@Ve}RqQ@pP%=${Qe>vYxejmspMcriY&bc4){SOL14 z$5ncM_P5vPRS>Sgr}6F1M0+Dvnzzwtc7PR}4047?_iuBBSlmxF@y$kJ^VyzF2wir?Yb9O6cqB<9FuRX-uGTUr9+x;P}7^IQ2ny?MN2?N{nqR^ z@U7}FH%DOO-%Cvyd{CyQ4&`fvL8!4F%U46S7yU)XJv*$2vQj(AqF=kRu=OXqY)?jp z;KU{;IJMRc(*50G{K-SM*FW7P88;aj8KxXBaZlFM(*rbaq^70<-Miub(R!f1z8)Su zdi0f-`z5Ypat^10x0V{pSS#b1o)VtvDMMCr@(kMTs;>il-yT*e$+}=c=Z*h08X7Cs zVgKKXyrYG}aBn9ZS!DqyyiFl98rePq=HZ3r!H!>ovQ9MDi}GX3Fw%XgPe1*XNg_W# zABu{K;O5PnZ;c1eF6*0`w{b4o?&dOye-$M>*HeO+&70sE*I2!GCCc0AYd#ls-G^o2 zp%J``^gVnh{vq)V@85d!GnTGvC6MM}3`aeUq5RC-<0;LjElEa=#&4n(f)giB!2kW< z|1sZfZEZqn=h(4hJa?;@2>+zNaonTCZwY{vQ}|!5qzD1Hmc5O0U43yO9I!S9PeoZ0 z#^u55eC%t~Red(;XfpY{Nj1w)ra{_rBS^(xSM~H=#y3f8A#rH!cJ$~`NJvP4`1p7@ zfBrnsJ-NqI{IyG$F2Qeq`&%Z9>gsBsaY4}d{`~p#8F%d$Qm%!@rL{{|auU=33IFbj zim*mc55i6KSiySggKygRv0MzzkgVofb(KecD8Ku3p7Y%mJoh~8Y6ywTO<`o9ccE2% zqxb^@0}RgTJ~Z7~U_&v=Ll7NgW@a)@SFc`$|M{Q)VS6*{#pB11Ghv8kXndfwzOGP% z{46hAs}cU)6ck_uu4Pv$%4uME-?;Cy<1SZ_^C8*o!#j6~T>aw1@sR3d00}4q@%+)4 z$noB0K;q{dI&_G^X-5aK!l$9RxfwqG_~U5@zOS*dF}Qf~B120=540|9Y;62mtq*#z z4qh4>4E|l^QHDoOp~p#9{%2T~1LRD22ba!{p7VIncYptmP z(i=hecR@KG#DBA+jJ!~Je=ML#wBe_#xeR&8tWYOA)@+q(!n3RdTRn)e)rW^ecV`Rw zR{iL13iVOKJFVx00i6T<`q#h4X;Omo`{<*OVBbEvs`Sl-TBLV3Jind7KOp|g9i-*n z#oCC3YhmHMloevake66`;k>|x>8dP)gI0PFZKVtMZ}tfc^Hn+0Tup1W*`Nmd%KPuX z&%rx44bV63A4LH=Tj*+Ug=;03q5R4jD7$LzQB!tK>V-4 zx-1C)sAuRM)|??ALrcmPd*`* zsc<0rx>lMGrCG_)dU-$e6&{%J>qWQg+51sf+c9WqsGY&15uWp**mw6ruhhqBhRHoP^Zr;qmNZH+Z3=W`5bJSfdf#QCCGP|}O;R$E-cjsN>d z0}EaUU?C-3WTf1p%?%*Z#+2pP4Lde{LZD{q_U4tj17*79x=bd-pH^2D}!vp%+&wd6!_`we#HkP^zFVt6;L(`?n zK2Ny6UY^UW6MpiOpK#LR9!FGgElx571TZIW3NjWYE1x zhXdZ}McmVmE_N(<44^btDN6Z9>T19~BQ5AE7k&n{I5h!isJRN|S@BH2>&3Qjx{?UB z1t+1dBnxGyvfz5*8K}E*2xu&3&&5^Q2jObbWug0Y;`38q<(2^wR^A)k9Z=2H?+N#` z4^%{+3pdXBzu$ZBJy^454d?#soxuTU%s+xOnh3Y?`)$MFU6I`QkHq{I1^*#x$`|+Q zYeD+@)o-;5bnm$2N*1oM4&Z!y5a-hq&|FsuBg6NBc(qYcQLudZa`5-}XTIZNqj9Xw z;LOc59^_@EqYjHV=R*;mi?a?*jrmvx#66844<9~+g9i`JihnjeY}~k!(@s4d&Cs5o z2>Dq@gwiG_@B%-sWSr#2e6wv3eW>iVy^C{zOVWWLFbK`&3`#+e@ zoV2l1Lwzasf7q>~0Yg1+kNjfDc{8biTo~^lN__Z|Fan_o31t(w-*Oc7p&-a^Tj@fYQW-qkm;(UU1{x;wR_LJp! zm)CK+|Njy5nG?seg+cs#??Sndz2+uwqsW{zi!PqR{nA0Gt1RNU>FevyyX|RwK70BE zwB%3D-?cgM^ICUZ&Cgv6JhpVY(68_I_4_VZ*awj&>-v@O$IM?Q;0qL(KAQ`@Q-+g!9_@}o2)vtbq zd-PfyOD6a2#TQR0ZNm<^KI4PTImgXq{1ZZjxqda*s0nTWf3U1(k#7fOti0=CJIl$ldBClR|MxJ@1>-+lU2TN$UvuUZy9$eL7UDgS=G;UWx;K5to92CX zA9@pW)22<(T7QkfKdt4;3op)D?!m!ZPSc2&&J=Fl%FO|KI)Y zcMEFwKmPHLFpB5GL|26W;tT2A$qW4M#(TJ}mnQj)*9#}<-34_YbK`Qp-#`4}4`<|c z9nT0V3Iw04&Imk*1Fb2dk=MW_18^FnEDG)^9i0EmcOw4NedtJW@u9W39y)UO<2efN zy#l;*6Zaw zN&n}6{^z{gof|jHmMvq_Ypy9}(r>|j-8IKqHQfcQJ-?3$f4z7TKg28k&Ud~eQdy*> zrJ1_|)F%xL4462ye&7b;FVy88hO4<}xSikVy9du2P{$KD{(Uf^MZ-O%h4}v*e-Md! zo!`b9faEA>d~UFrQgYa#r{n4^r}0{H5J>U#~(a0x#hO*K5;!NI{IwK*FXfB3^6c=&Yd*RN;N zYiq1#(x*JCk*_-!lwO$RA@|_fLswf96P(WUzW@F2&sv`EeeZiS$PJ45)VGoZ$c+3eyh*sQOqVEF8p5H3X-|0z6`ht3cw&h`A`oO4|Aqcg|Z%0qGmBoi_l)Z%*dYUV+aWLEgop|K=o zdnn!kRATV&qo)gJR=Ysfa%(u_hI((EEEuBfPhZ++`qv$i?OT<`=8L$l@16VXlJ@5% znMq6>lHKEED;i}$QdT&juH7f>;w{K5 z%1nmFD@pK3z}kZJw#?S&h)0~BE_`o)z2pLe%WLQ3MDBAHg_Hb98UyNZ40t&9fTw;W zqd@ZJ#2cn{Cfy~rw?`e70^Z2rj(EN7A~UwsRnHvjxWn;()0m$Y5zgoVpnJdp)|N2L zbvNV5&^^crTn~pG%plp$6b{-Lvtlfb12LUNrvb!&G~qwSL>rF!ti*fWkNJx`Z+ltp zSq4Y#xKUcPt%@qvCEJpdstj_^ppn=vGhSGa#S#M_uatd$XS z7ksCg{-HQGxA!rRMWcf~`kLR4Hq^=`{KuN~P zO4u1No%aZOpQPd1Cjn_0Nri8`vCrkw8y4688U`~e{Og84$;g_9gPpbnHvsJ~Xk;R%SE)(zAZPBNf9C{I*$Npzmi zLzEle?(T?sfK(a$r=VUh(jO=aw3n5@E;B>Ky)L5*EI?PgF37-u7}1MH1E(C#evx2l zP)_)dx7LGnZ)bRT_qHg-6Bwoq<+vLzqMT=b8VubX6c}bcj!iY?j64DL{gTVma#-_8 zgVut%S;siCg|vsLL)ntfmbw}Hdj51NF3Bx6BkrjTd6`E&9YHO9CuCGPeAErB7EzNMT=sM|Q`C^NfB8%{!Xr~V; zu4Zt%W%mBdUrug&LCz_rt*#fG;>ZDT`-}Qb>j;v!q;{`3AHSeG7&NxzXP>|`+iCf8 z+85LoXCWQbGilS>oPHGc7T$#;xe=0EC7JPVMjrJTJP~n@ymmPUHX3L!y5QF9Ye4b2 zNj`?Cb>|K@*wqOkNCTwPf!^lBHyTgVy)F#%#^XSejp^?XIhfr_$Gt`d?m14QPTTVM zy^x4^K$9H|n0w&Y&!x|sUa8!)?kdijl)tDh&W2}iu)k<)s6yN)Ft{ff;@WG|JX!9x zneR8rY+cQolno%dq94gCwcz<8-36-6O~?7>2z2C4%cIw1AAqv_3nH!em^T#nMZ!jX zH6UG}+g~|DcueZ*hHjoAwyA*P#7o z^&#YWA?@G9edu8iO9ua>2O@j>26!@jZ$^3Ma=4FsnX>bfYxX*vzo{>C^LK>Br!Xxz z-gZpko_IKgm(K|c{zmR&4@Mb$mYhpKS>EaKfK3l%lH71bW-OFkIxVu?*<(z1=gLW4 zu!R4Uc(+Q_xn7itG?bOn`@GCsz4$H^%SBmP7URu}2BM6Oe;sXMI6!*~+G7w6RHjbi zo?V8=!$Xi6>;s1o|7q?*R!L7QfrWe=<`6RzWy)q9iKkhQy>j6 z`^%!Z7=e1dUgNr_KI=H@0WyK~6~=JP(*$y(gXXOlgz#F3>w#w67gE3KK)KoLIL4AZ zenWWpaRn#T6+mx3*vKjBVS;mx0b!^^eygEwOPG-!qg#?_;6h|LuM02ZOu@8F$1d3$1>vq8_(P(jrHZ3@px}2 z6ZQDs=TG8mXCJ|RQjnwhNJ>++i zeg)FAPf-ujJymuK@Js zqnV6?KNdhJ{#UE1nfsvJ7rp0BG_V8TDjq{w&4mEbLH&iJaLU&TP!~LqF7VRiZSZt- z{`-W5l;f+6dlPj>gyGpNy#yH22a?I?*P)zPfuz1jGOs**&0XS{^hN4f?U5RJjT!d|_ms1_gG`W4z!+N5`+X3=d z;TiHuTgdjXfwS%?&w>0k`ymzH~GAtM(=WfAssR8TOX_n_$gXrh6A8`i%O z9nPnH>D`|jm6zZ`ggX@ATR?@o>>+#iO6adEfY+}?JM)-Nes3e}-M(%}3i83XfG6Jr z4m4Bi-Da(25@w^bL|9vMyPtP+`|jmcwtr5sHL}`gsbOM~G!Yoix& zHpa|5dV7#ZuoK_ZWuNVkuFlOmTFg96^EDTr2MCY$3W~36<>aqg$|(5ReWCoH+<6N6 zMp~(L#61GVU5#?DBlo`Ax%t6BC*;Nj0KWSQW%w3c-Y!SDk`w|Xx4N;oUq5KTJxSDR zdwdUE4+E`Mdee6yANVadUsp-eN%ymDHFwxZsG0=4m*3;P(psN+; ztF0N1^K>}sZw~iVQQ3lh*V#!)NzFx0?vHMt>V8+${H$darD=W0eiJf#4q3LhiH#?> z`=MZOAY_Nw0lf!VgzrI~4YgsNKM)85t<}hXc=a~3pEd2Fn>QeBR}h3b>9g4H!TX!3 z)&`iX%45Vu#rs#8o~5*080`&+2HZ8Y@ciYgTaUd)zR*Z(Bb3JMgo|rjIBTTh)%LIB z>~yZCtT#BD6=FF`;{v@2dtti`>ul6oXuFz&d(y?fm%>i~50IaA@lXuxS!oXYmm5Ni zJL*q)83=6W|Eo~~jta)Tt5dVKk-)t0l+|T6Z<*E0;FXDUfC$?C#j)!@{ z<->d6M#EL4i8q%^Bi`nNySL!##WQdy!XIMrEsHo$BRH_q2==(?O$1x3UEb%0f^cpI ziz-|7w(u%yx`cmI)Eh=L5bm>XQSnW(qIcR_pz73d$OzmBX>K-f4$qEht$PvIyvH0( zZ>QMk$Cr57e}Mv@BCVP5J@}ue`5LWHS!Ymue6#8Bg-{!uFKpoaR(xMB*cy&(wqP9! za)YzcesC!{0`iXThmy00@Qs_ZxIfB=Hk1+R!24mHC?i~aDjCwY`@n&<){wB;7?QnB zAPLQcRmKpz!eC;Hl}g2SI}MB26^0*(+MeIEaHf*7!GwR@AL2ey0Zt?&0=-8iD$p6j z$n8OV`=JV|GSA{VE*6e#S_iQXmJo;UQzY4%!XbNn4+weRX%1!+G3L5e2Q2k`F063) ze~ZypIooW0fcRHP_caMjTw_p>zR~3V*)3LZCJ^Nm0xaQ_za^aTvw)1v7I1u%IUMsf zhxCnRa0K5bOIv3KhkZ;TewER9q>Fa@PA9GOI8Q?t#Q$gUUPk}2IOlG6QyH0$5&xrX z8nD2%fUTkm_&dA8fsjy0i`omvP!HNE)PZ&u@46h@69vh5Pb+5KTG(!Hi+o}o=Iv2> zf0FhmB!3u*=SB1`(SDLiHP^ej-@;(uAv-h0#g4Tt}zPW$(ja+;+4|EX6<)^7KK$B_!URw)c@;A`pLD@V69#@LxjW zWBg6p8LPy%rtBXw(I?%=|HHA#Z~ABKMSS+4X*(tTgK4V-*}uXT=peU#ATx^ zNxb%Vp^wLZF8c?-Rd$TYZ~qX+dD8oU&;IUYQ*y#AVH%xd#qtqSxBzdW@&HV=HQR9u zUxl{tRcNNYh#i$NXT}fW^XIkm=Rb!Xsg5T;_NQ6xctwZDANymG1Q+nzF?=7FH}w@B zJLb=eFaTZz$@AH#Xq}VhWG~@Z5#e0KjLz@!#ebJCza_lo!CqE0ofv)b))(!(-ZSic z^dZ4p9El}d_8($W?{ZaFz7Gj@+Kz40Cm}!GJlK{9)Aps)_GMJ4Egbt2D&*AANa2@K itjXX^d<+;gnHtmFJcBBhk4cB~$BxKx5P!_41^zz \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/hyperkitty-logo.svg b/kyperkitty/static/hyperkitty/img/hyperkitty-logo.svg new file mode 100644 index 0000000..73dd569 --- /dev/null +++ b/kyperkitty/static/hyperkitty/img/hyperkitty-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/img/like.png b/kyperkitty/static/hyperkitty/img/like.png new file mode 100644 index 0000000000000000000000000000000000000000..7406cddd0dfaee1fbb8811c1a3a71df005366c44 GIT binary patch literal 915 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 FV1jY>b}9e> literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/mail-attachment.png b/kyperkitty/static/hyperkitty/img/mail-attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..529bb7f554dfa585a4a8d6b9135956b188be3f37 GIT binary patch literal 649 zcmV;40(Sk0P)s%e4^YA&(d3cVhTCLK&Bw17g6TmTG z1V{n*fT@5#xT4HeH3O0?b^tS7rmoSw{r%V-b~ZOQiN#_pEk6BTsZ=}xe=t$cSGQab zmz{mi(ebe{R#sQJ6}U|#@&J>`gv;$R0T-3Ye*j4q&q%WP893+j`Iw##vHWIvYHO=7 zl>V7MAB{f7>-7Sh`X>Nf@%e^rz^+b1Cz(tJ;8MUJTm){cudQL&u@hi-JD_9GGYEiI z(AHxWNfwU+*8l`T2hh+oL9th9b-HH241~;Pvnr8Dpb>-?Kv{uGC;SGqx_WF6pgJv| z1wdDW+XMBRg})V4l@)2!{{iYJm2wreS`E+xP%4!GD3*%b1NmGYfLE_yGT`11Fln=P z^YPOM0P?w93((NSLZJrC%||(L{3KS3&1kV$2}foCC=?3Y0_)jq)}YtxNhW_}CU0Ih z_SzjhiasQ}k;T#LB>pW95Nr2@*@dMACdQA@(``3uG#cK$e@nSi#bYy1oMBO%h6bQrj!1R8#$B#Q=Wvpxb0Q=5Y{ jFbmuT!U2DDE_ literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/neutral.png b/kyperkitty/static/hyperkitty/img/neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..392f8c7a87cbd1bbe885c07483c086efa93b4592 GIT binary patch literal 895 zcmV-_1AzRAP)x^mV=9^oTE?`2#0nM_ z!Ht9p287_UM8u7yDAElG}7Wm+6a=?#@gcVLQ)zcrBOq)f=%<&6f;RA$xNm< zbLW2FaWN>R^{fwv_dSQlNa99~9Wy&^5cDG3C6_b-7;6_nr@j1a(6d|&hRGztsH!F+NXD%+J+1uSMha|>7s~fmF(HqIF$z4Aq zAO9iwisY-3D@jQ~e)EFjl{b`JKd0&Q&qU+L8IXiI{|POrhQ`VE7pAr-p1`I%c)$NJ z%S#15?0*~iGKcyHSzfxv2k$&ZTs%eC@EX6IeX&^GDCe!sga=wX-^!9)!Gzm^fD2RWEM;vXp@Iqcd)xHk9-7v zogEKk*|qa_6#oVoTr@^Dx7Ql6FZ4;$XzOw)UV>x+1^06N(?g&t@+;s996S0vBr_

SY+I&3MP1le@dV+oIA@ejWXsXrsjcDP14((5@EhbMG?w?fznQ zqntOA_-QB@XngRwSDM@UGKK&XG}Nk*YOly4Iebz;Zk2_pkD}$-u_K*5dOZY~Px*uX z@;4olX>We4FYU@Bxadb*JcE1%6XXc$_YmIpELW#K-dvg)`*|VF!OojuTHju9@q8Bhn_#*HXG5=`3r`aOmPG@ny|@MEe*mv^ VyC7FigF*lR002ovPDHLkV1ft`oWlSB literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/newthread.png b/kyperkitty/static/hyperkitty/img/newthread.png new file mode 100644 index 0000000000000000000000000000000000000000..b8edeb8b2fdf28e868f1fb44b11aca6817640d11 GIT binary patch literal 3180 zcmV-y43qPTP)MzCV_|S* zE^l&Yo9;Xs000Z?Nkl2s6E9mkWB^i4DU58COZo&F1bk(o{=lWC`&0!g5u z2_zu_0)#+93N$GYNJ0aJaAPp$24iAFFnAwXvLsuwtxax!!0#Gxno>e%JoK&$IiC=FxNbxk`W+!Rz1%xC@lP117-)Z~+-;0*AqC;DySb zRTf7jDb|3Wz!;e1b@Ceor-l34KNW8kej_-`Z{o>73JigIu%arKt z?@+%E|2P-bpTxUc`Ct^-!5h^kK4C$?pGliX+AgX724Am?YMG#(+$#$3hiW6AkRafB zuovV6P0E$-TgV;@}paI_yH8-5*lvD(hZDhQFo%yY>; zfq#E^x^^-#paHd27R5QTF1-bQUM2{50f=~B^+)jC#i86R5c9jLEDoL-i~}F|YpEc0 zOhWMmTwCSYpx)TV15@CYX*t$|bk_m6p~|y_uLK>_yGLAf4{n){{yihYX$)V?Z&&5f zkko<{C&*!DK(iBWpAYYe6L<1?I^mh-)*Nseu6m28cYgy~yNHKE2+mUU=SMZOxJwISD)RkrpMHylpOX*TS;(IvYHJqoTL4NPV zeUe9z4?2t&Y&UIr21!v!=xovuYe!mpCely+1}0|W3<7q(hcSahWDcAlW5c3+J(lGn z?eMhcF7;KR!J)SNHJs3xFNa)0a`rCno$$5L7=CYip-xGT)X7#7YU{~1U}1i2v>?ch z@~+8l6G51+_8wR}8)tJ3S#XLh$DANu}6S zDp4Gp$-4%dC-fIPvveL&TTHo@jGe-cpA_k(co`0Pr{m~Gi#guG!vSuoXTiOLL z&&COUC~4n(+{T9bxxN%bJwVeE9zZY^migOtxo_A-Oo}AA;MAb~7B-ECNBZ-h5X;X| zsLLnbfw(r`BB;^l>{O(ANiIBGjBHK|kZm+Pt|5_^5<62v@tk&q`oD|sq4R8RS;lmW zLA2RzdCSONGV%!;(1rY*$j&I2Eor{ao(apQ<3tAA*-B25tGhdwG}o}vc9B{(Au3T^ z@8<7gE#AjB@eMqbc#jc+yn2*+ZtWf7+r1f!{T=q483yRB%A(fOsAHx`D9d(?I@_G z5uELuAOTfbU807L69cc*w;!0c@Ga5U}GB_Ef8=^s34nAL`SVf`SKk9LIZ|+JYDBo z^zK0c7jZc{P5hAV4BPmm%f!FRuE`0ffpK=7VvpnTA$ z5;YkZeam#*0n2LkzDT+z;_q{U$ctIEW3)z13N|NQoFH!beiCH^j;7r)cPuoPz$1gO zS(Tv`eTa9U@ys&3nO#_;{?htmPAbxUY-uwv{bF`g#}OlJ7IK1wTrw)iPUP!h?I-A{ z6nhfxm?s|3jo={uXAx_>NKT4zY^LyC&~sH}wu1WGds39mLa5 zStikgtSJ%8di)Q32;IO(*)?L=aUmt8Sc*!4zbYUQQ5$P|B|Aby$(^%v{Hx;+P#W z(cl|}*~IKy*f#AzeqCw(J}s@~Bk~m3Nh&W0Vu1`Nh(F>|76j2!>yYbXx(blzCsj(2 z|2KKa4;sE;A8J(DS~k!=_v1FX_Qc_r+|5Kp%jt zA`T-}o)yYLB1Z!Jy7;184KJ-8f{DeW8WN22N2@$Mt)t8oz>EO=zVyw-B}`jus%IRI zEe_QLFAYRsQ0sit81;ZaU88F0J${`=$pIl?cPyG%xg;6oxq zOcq=QKdZL$3H*Wz>;(Cad=G{TM1_SJkO8}^t$cDnX?vCFV=@w?d7v0QSb{)~5rf}W z8~J2^^!Yqk#kiR%aZZN+zbqQujfGPn&qTn=Y7?K%&!U%rmEaaL3UY0e?O2MtupGyaK)>!pO-TGscWCHbzK<*bQC-ORCL#68sMY5PoKw S15$+m0000MzCV_|S* zE^l&Yo9;Xs0003VNkld-C7Lud^F) zD43=`@9UHQcmL1%GF1XY!7Aq2nsYZF{Qd0zv;TX3&N(u(U{=^{+nLJqIT&Vo&tE?8 z_UxYvKW+N*@IOew(~3Qm~+V?#7vNhyb3;J1ZZ;2LPJcJ2WPHimU(t002ov JPDHLkV1j34zJve( literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/participant.png b/kyperkitty/static/hyperkitty/img/participant.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6b86145b3c7c0201c8b11d464f9fe1685566cb GIT binary patch literal 676 zcmV;V0$crwP)46t$xxv>XRxW8>ppYgSEj0;ccYV&pVDz! zl2TWOVIadWl$280ZntE!c_ORTooM;R@~y5J5FrYNVMxbmK?n}U*xwU@a|X@@!Z3i5 zPK&{mezS)KNu`h^lgWTF1^^I(10WEBgL4kswxQ{|q8WO&>jej2zHaUx?1yJAm4G}i z;+#PU0VyRkO@n0}qyEj>?D~ajwc4rI8+&HnEV?co@H~$@?Y3yQ9pN~RX#Q%V-l%)! zjqD5O7vezys020MwQ8&%WVIlg@?_IZfy1xF_1`q)d|MWk#ODY!QhMDOA0000< KMNUMnLSTX+cP7&S literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/reply.png b/kyperkitty/static/hyperkitty/img/reply.png new file mode 100644 index 0000000000000000000000000000000000000000..7348aed77fe6a64c2210a202f12c6eccae7fcf24 GIT binary patch literal 641 zcmV-{0)G98P)Az`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E? zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_ zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{ zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L( zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7gcyqV(DCY@`?%81(~u zLR|lY0K=+Pq4OIQR`ppf>eidvsXn_^XMUIVq7Ll^T{?3+^%iyN%(^Q~ zQFHku&E+6cW7!1FWfQcP^lF31KJ6ua5OK{V{aQ==wKgwQ-Z)QX?>hNa)6@@akXzCR z5?nb|W9>|}4Rcf>+!d2G_N|u#sh_B|cb(kg9-txGN481>RRXOzzDw%l9;rp$+Gh_+ zTsSHUlmc3M{)pK2Ws0{i30^%deC@38<2$_1A9BBX%Jupg=i8SY?_P0yc*FkXBkPw> ztlz${eE-Vw;~VqO@611cF#rC=^yfFzpFfPifC}<_6$%XBz>*-pU zUgpua=~+YZ%nFme!9jbrEOq(0bB1Kg)UP(aZ-jz^CNbIe@Wz%(gw!|-1t%z6iD_u` zJgLQYjDNEri=<+%H0Q(i+uV*kqT5?IerP)7J~VFPV0rDtdc-FxnAXuY&$7+YDTu{>u-Llc|&jI_xtml*njRg&k17TpHAmBG{1&t;uc GLK6UWvo!ty literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/show_discussion.png b/kyperkitty/static/hyperkitty/img/show_discussion.png new file mode 100644 index 0000000000000000000000000000000000000000..54c01ed37b3f392ef52a3cce8d39ab83df3cced3 GIT binary patch literal 1806 zcmV+p2l4ocP)MzCV_|S* zE^l&Yo9;Xs000J!Nklv)Atx8T5 zL}C4vwK9_oi9ozzYi+*}g~GOlnd7W&=Y2_$2e+1EnR(k51>dGue7Wl)_^(J=--qLhJ-_Ype|c>V%~$RDo=g8H zqchK*@6O$96rV45!VNJu9LCc4fjv`uCu2sm4w%OdB66|eYp);2#YWAjX7pI!DIv4D z=?~dv zY)4-pqFP~$lI~hdnp9<$bdHi6+^OEAp>%An0^f$x3qsOR@&LpeDDSNXu$~vvBu9y) zV~lyuq`?ydTE3xF(ly?{?nv%W8p`n3R!F)#Y?@T^2)tQChCgBWOxOK7d6p*Sv|B39 zc4qilLwK!{PPi|N@Rz6$MfF42XlnPLc3+8XIsOch?eklMXbq8ULDc(74!lJ~xk@eM z$b|o1*&{^uPmB5sv>`RGMSVIw`Aq)?tC+an?5V`3P^(pkK9h}m< zRxfF>s5jLrSAluwr+qV`{*n)o#1V*t-mI$<_4{VFe%8D?G`TfcViWc80my%3LbZIg zjb`aXWJ0t~rO9tKLRa>70U5y^PkJrsxUvvNGr^KRAtuiQV8kGlWROb9sDt z3XwBI*bqH|NTCZGcFrqTO)Os~80n8TL-ZR&j*Yo0v7z3A4Y__qPK-j7nu=hpwLgG; z)YV}_dxfh~Fe+DfEL7JEM!w8prdg<*7rL?GD3$l*h+r&qA+j~tUQzxSYAI^2fzRj8Ib;UPACjmOqYU7EKLT+d)r!Wiv<9&9pkRLdo7I!oV(lxN^~d>j#Nzx;W( zO&QeE)6l!3*3>J0^9CFEC%u4?yGBX7Cx>#y&~k5kuqnG|{iRq*7^`l;CMZ_#`VyDd zK}86_2%=yo@vqhoXYusY=31E-k!{N-0*_dErtQO~9g8xDw;GP}fxV&$d_=k*sOYvg zyi%c77NK6Wgo3lVt@3E^C)%=-Xi0pD$n{RqQr$vDSQaf=RP&=#;Bn|ZB3F7u%k@rr z5$O4|4Z9YO%+Th49m<$GN{bm6EpBV(AZ)wbC0dTsjwtfOYUAUAjs#j<+#Audhn`h# z@0YlO4wELbRmOELnr1W&bSw-syxjh_c%& zorvt218>;jZ85xB-X>p%2F!#)*Qr`P@hbbt$(KM<!`I0 zPc!ISp$sxDn5l0C-(8ECk)yzS1E~R6i+ij53~T2{!4^w5bf*K>3cJd@xdVvAPhlpT zp62!y?bDmx=bmAPrJ}2XIl~7(LLAf5*pwP5mdd=RX=mmPV)? zhKhSI7yTaAqSg-2*6^6~H)TCn1;G;g4!q8dse(~!Iip~+wKu!utg2w_I~U#czIm7_ zKSzIH+rgJgGYTBqfGqd1=|(r^%=Bg1y8vu4G}oQp@M`@|`8s$+*Vo|P9N**<+~2Nj zpw-*z{oeYIqOIL7c-lfO9PjXMtcI_-Ja%DYUl7ax!!8APBOf03Z{U6Mbr7*Hav@;( zI&|ZX$c4}=i!g}$A{YK45Mh}Q;E~7$A7B?1HlJ$-k3}w8-`hO!N9#h%EI;j^iahYs wj#+lmwnae{?C&hcevHV!+&|jv%x^^THv>6!t7W8bZU6uP07*qoM6N<$g45%8e*gdg literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/img/youdislike-disabled.png b/kyperkitty/static/hyperkitty/img/youdislike-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9d518fd44df707302cc27582a735646b102faaca GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s3?%0jwTl2L&H|6fVxatW5N34Jm|X!BWH0gb zb!ETH#Lj7^=_vC@4k%@R z(WB?jpMU-O_51hlzkdC?^^?+LpmvUuAirP+QHPm#KK%S8AV2F6P>eCj+uensgH_f8 z$Z_^`aSY*z4(&DMYcLQvJZG8c|N8e6<(QqcX0x9b%Q*4!ZbxF|+;h{G@lLq2Nt_|X t=0G|-o z|NsA2s;E>bC{!ye*Q%-l$vGAll}buGe0_KM`JIf2xEvpUucPD9v}sS~%z3eD)ywtk zKb}3C7oXJvG=ZZe$S;^d)M4hG4?lki$j>?i6m#`-aSY*z4(;72ctC;Y$d^4k-|Wvj zP{t*7Y2^h^CSJ?kQieLKH*a3DfzfFD8%_po(PEi(OOGcu)CC*%$5;RTv%C2F`uFUo XKd305ep0*}aIptaXQn9)gNb_G!IxTlL_2*>r@{*76O92gw#tGYi}w7}zW znwaJfcD*33NZB|4mvqeHFDmA`<#}+gx1)jR6*mp1oy{gidaTwzp0W3<>wJ(p(Q=|q zNm=)?C*L8X8nNJb+lpMXC#_~>22mXr1@=v|7J1H>tmgUo^V5qHN5Z?Lx#CZ{2$}A& z3SiZ`!ua~FQs!a4z4o6u8&u~n6uG%zK!Rwjnp28LD!23Ozt??lm%o1c=IRteEyV4-Vh9Aao}WoT+; zYNl;q1k}LtKur&*K@wy`aDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0uvp00i_ I>zopr0JT4LXq?N4;y0 z`nF#Tn{Xw0%C(G{H}V(Wu3mbpY3ZGYmA53r9(i zUoeBH!^}G$e*O}WpLGZ*7UAjQ7{VbN+UqIQpuoeztil-MSZMzL|FRD8HQQ@lZJy`zX>;bMeCrdD_@-KI*5KRIonyF-qilNrVWvLKxkXDwK5SoayS{#h d^T+W0{Jxs3l8MPrYJqkzc)I$ztaD0e0szMdg?<14 literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/js/hyperkitty-common.js b/kyperkitty/static/hyperkitty/js/hyperkitty-common.js new file mode 100644 index 0000000..7f411fa --- /dev/null +++ b/kyperkitty/static/hyperkitty/js/hyperkitty-common.js @@ -0,0 +1,323 @@ +/* eslint no-undef: "off" */ +/* eslint no-unused-vars: "off" */ +/* + * Copyright (C) 2012-2012 by the Free Software Foundation, Inc. + * + * This file is part of HyperKitty. + * + * HyperKitty is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * HyperKitty is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * HyperKitty. If not, see . + * + * Author: Aurelien Bompard + */ + + +/* + * Generic + */ +function form_to_json(form) { + var form_data = form.serializeArray(); + var data = {}; + for (var input in form_data) { + data[form_data[input].name] = form_data[input].value; + } + return data; +} + + + +/* + * Voting + */ + +function vote(elem) { + if ($(elem).hasClass("disabled")) { + return; + } + var value = parseInt($(elem).attr("data-vote")); + var form = $(elem).parents("form").first(); + var data = form_to_json(form); + data['vote'] = value; + $.ajax({ + type: "POST", + url: form.attr("action"), + dataType: "json", + data: data, + success: function(response) { + form.replaceWith($(response.html)); + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(jqXHR.responseText); + } + }); +} + + +function setup_vote() { + $("div.container-xxl").on("click", "a.vote", function(e) { + e.preventDefault(); + vote(this); + }); +} + + + +/* + * Recent activity bar chart + */ + +function chart(elem_id, data, default_props) { + /* Function for grid lines, for x-axis */ + function make_x_axis() { + return d3.svg.axis() + .scale(x) + .orient("bottom") + .ticks(d3.time.days, 1) + } + + /* Function for grid lines, for y-axis */ + function make_y_axis() { + return d3.svg.axis() + .scale(y) + .orient("left") + .ticks(5) + } + if (typeof default_props === "undefined") { + default_props = {}; + } + + if (!data) { return; } + + var props = {width: 250, height: 50}; + $.extend(props, default_props); + var margin = {top: 0, right: 0, bottom: 0, left: 0}, + width = props.width - margin.left - margin.right, + height = props.height - margin.top - margin.bottom; + + var w = Math.floor(width / data.length); + + var format_in = d3.time.format("%Y-%m-%d"); + var format_out = d3.time.format(""); + + var x = d3.time.scale() + .range([0, width]); + + var y = d3.scale.linear() + .range([height, 0]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom") + .tickSize(0,0) // change to 2,2 for ticks + .tickFormat(format_out) + .ticks(d3.time.days, 1); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left") + .tickSize(0,0) // change to 4,3 for ticks + .ticks("") // change to 2 for y-axis tick labels + .tickSubdivide(1); + + var area = d3.svg.area() + .x(function(d) { return x(d.date); }) + // .y0(height) + .y(function(d) { return y(d.count); }); + + var svg = d3.select(elem_id).append("svg") + .attr("class", "chart-data") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + // Convert dates if necessary + data.forEach(function(d) { + if (typeof d.date === "string") { + d.date = format_in.parse(d.date); + } + }); + + x.domain(d3.extent(data, function(d) { return d.date; })); + y.domain([0, d3.max(data, function(d) { return d.count; })]); + + + /* Draw the grid lines, for x-axis */ + svg.append("g") + .attr("class", "grid") + .attr("Transform", "translate(0, " + height + ")") + .call(make_x_axis() + .tickSize(height, 0, 0) + .tickFormat("") + ) + + /* Draw the grid lines, for y-axis */ + svg.append("g") + .attr("class", "grid") + .call(make_y_axis() + .tickSize(-width, 0, 0) + .tickFormat("") + ) + + svg.append("g").attr("class", "bars").selectAll("rect") + .data(data) + .enter().append("rect") + .attr("x", function(d) { return x(d.date); }) + //.attr("y0", height) + .attr("y", function(d) { return y(d.count); }) + .attr("width", w) + .attr("height", function(d) { return height - y(d.count); }); + + /* draw x-axis */ + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + . call(xAxis) + /*.selectAll("text") + .attr("y", -5) + .attr("x", -30) + .attr("transform", function(d) { + return "rotate(-90)" + });*/ + + /* Y-axis label */ + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + /*.append("text") + .attr("transform", "rotate(-90)") + .attr("y", 0) + .attr("x", 0 - height/2) + .attr("dy", "-3em") + .style("text-anchor", "middle") + .style("fill", "#777") + .text("Messages"); */ +} + + +function ajax_chart(url, elements, props) { + elements = $(elements); + if (elements.data("chart_loading") || elements.find("img.ajaxloader").length == 0) { + return; // already loaded or being loaded + } + elements.data("chart_loading", true); + // if there's already a chart drawn, remove it and then redraw + // this would occur when resizing the browser + if (elements.find("svg.chart-data")) { + elements.find("svg.chart-data").remove(); + } + return $.ajax({ + dataType: "json", + url: url, + success: function(data) { + elements.each(function(index, elem) { + chart($(this).get(0), data.evolution, props); + }); + }, + error: function(jqXHR, textStatus, errorThrown) { + //alert(jqXHR.responseText); + }, + complete: function(jqXHR, textStatus) { + // if the list is private we have no info, remove the img anyway + elements.find("img.ajaxloader").remove(); + elements.removeData("chart_loading"); + } + }); +} + + + + +/* + * Misc. + */ + +function setup_tooltips() { + // Setup tooltips + $("body").tooltip({selector: '[data-bs-toggle="tooltip"]'}); + // Setup disabled tooltips + $("body") + .tooltip({selector: "a.disabled"}) + .on("click", "a.disabled", function(e) { + e.preventDefault(); + }); +} + +function setup_flash_messages() { + $('.flashmsgs .alert.alert-success').delay(3000).fadeOut('slow'); +} + +function setup_back_to_top_link(offset, duration) { + // default scroll to top animation will last 1/4 secs + duration = (typeof duration !== 'undefined' ? duration : 250); + $(window).scroll(function() { + var button = $(".back-to-top"); + if ($(this).scrollTop() > offset && button.is(":hidden")) { + $(".back-to-top").stop().fadeIn(duration); + } else if ($(this).scrollTop() <= offset && button.is(":visible")) { + $(".back-to-top").stop().fadeOut(duration); + } + }); + $(".back-to-top").click(function(e) { + e.preventDefault(); + $("html").animate({scrollTop: 0}, duration); + }) +} + +function setup_send_as() { + $("div.container-xxl").on("click", ".send-as-default", function(e) { + e.preventDefault(); + var select = $(this).next(); + $(this).hide(); + select.show(); + }); +} + +function setup_expander() { + $('span.expander').expander({ + slicePoint: 500, + userCollapseText : '\n[View Less]', + expandText : '\n[View More]', + beforeExpand: function() { + $(this).removeClass("collapsed"); + $(this).addClass("expanded"); + }, + onCollapse: function() { + $(this).removeClass("expanded"); + $(this).addClass("collapsed"); + } + }); +} + +// Setup keybaord shortcuts on all pages. This +function setup_keyboard_shortcuts() { + Mousetrap.bind('?', function() { + $("#keyboard-shortcuts").modal('toggle'); + }); +} + + +/* + * Activate + */ + +$(document).ready(function() { + setup_vote(); + setup_tooltips(); + setup_flash_messages(); + setup_emails_list(); + setup_send_as(); + setup_expander(); + setup_fixed_font(); + setup_keyboard_shortcuts(); +}); diff --git a/kyperkitty/static/hyperkitty/js/hyperkitty-index.js b/kyperkitty/static/hyperkitty/js/hyperkitty-index.js new file mode 100644 index 0000000..393ab9a --- /dev/null +++ b/kyperkitty/static/hyperkitty/js/hyperkitty-index.js @@ -0,0 +1,100 @@ +/* eslint no-undef: "off" */ +/* eslint no-unused-vars: "off" */ +/* + * Copyright (C) 2012-2013 by the Free Software Foundation, Inc. + * + * This file is part of HyperKitty. + * + * HyperKitty is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * HyperKitty is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * HyperKitty. If not, see . + * + * Author: Aurelien Bompard + */ + + + +function setup_index(url_template) { + + var list_names = []; + // Collect list names + $(".all-lists table.lists tr.list").each(function() { + var listname = $(this).attr("data-list-name"); + if (list_names.indexOf(listname) === -1) { + list_names.push(listname); + } + }); + + // Redirect clicks on the whole table row + $("table.lists tr.list").click(function(e) { + document.location.href = $(this).find("a.list-name").attr("href"); + }); + + // Helper to load the graph + function show_ajax_chart(listrows) { + var listname = listrows.first().attr("data-list-name"); + var url = url_template + .replace(/PLACEHOLDER@PLACEHOLDER/, listname) + .replace(/PLACEHOLDER%40PLACEHOLDER/, listname); + return ajax_chart(url, listrows.find("div.chart"), {height: 30}); + } + + // Filter + function filter_lists() { + var hide_by_class = {}; + $(".hide-switches input").each(function() { + var cls = $(this).val(); + hide_by_class[cls] = $(this).prop("checked"); + }); + $("table.lists tr.list").each(function() { + var must_hide = false; + // class filter + for (cls in hide_by_class) { + if ($(this).hasClass(cls) && hide_by_class[cls]) { + must_hide = true; + } + } + // now apply the filters + if (must_hide) { + $(this).hide(); + } else { + $(this).show(); + } + }); + } + $(".hide-switches input").click(filter_lists); + filter_lists(); // Filter on page load + + // Find field + var find_field = $(".filter-lists input"); + find_field.autocomplete({ + minLength: 3, + source: "find-list", + select: function(event, ui) { + find_field.val(ui.item.value); + find_field.closest("form").submit(); + }, + }); + + // Back to top link + setup_back_to_top_link(220); // set offset to 220 for link to appear + + // Update list graphs for all lists + var list_rows = $(".all-lists table.lists tr.list"), + deferred = $.Deferred(); + deferred.resolve(); + $.each(list_names, function(index, list_name) { + deferred = deferred.then(function () { + return show_ajax_chart(list_rows.filter('[data-list-name="' + list_name + '"]')); + }); + }); +} diff --git a/kyperkitty/static/hyperkitty/js/hyperkitty-overview.js b/kyperkitty/static/hyperkitty/js/hyperkitty-overview.js new file mode 100644 index 0000000..73ea182 --- /dev/null +++ b/kyperkitty/static/hyperkitty/js/hyperkitty-overview.js @@ -0,0 +1,73 @@ +/* eslint no-undef: "off" */ +/* eslint no-unused-vars: "off" */ +/* + * Copyright (C) 2012-2012 by the Free Software Foundation, Inc. + * + * This file is part of HyperKitty. + * + * HyperKitty is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * HyperKitty is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * HyperKitty. If not, see . + * + * Author: Aurelien Bompard + */ + + + +function setup_overview(recent_activity_url) { + function redraw_chart() { + var element = $(".stats .chart"), + chartDivWidth = element.width(); + ajax_chart(recent_activity_url, element, {width: chartDivWidth}); + } + $(window).resize(redraw_chart); + redraw_chart(); + + // Back to top link + setup_back_to_top_link(220); // set offset to 220 for link to appear + + // submit search on enter (only add if there's a nav-tab's search box) + if ($('ul.nav-tabs').length > 0) { + $(document).ready(function() { + $('#nav-tab-search').keydown(function(e) { + // if enter is pressed + if (e.keyCode == 13) { + $(this).closest('form').submit(); + return false; + } + }); + }); + } + + // Collapsible thread lists + function collapsibleDivs() { + if (!$(this).next('.list-group').is(':visible')) { + $(this).children('.fa-caret-right') + .removeClass("fa-caret-right") + .addClass("fa-caret-down"); + $(this).next('.list-group').slideDown(); + } + else { + $(this).next('.list-group').slideUp(); + $(this).children('.fa-caret-down') + .removeClass("fa-caret-down") + .addClass("fa-caret-right"); + } + } + $('#flagged h3').click(collapsibleDivs); + $('#posted-to h3').click(collapsibleDivs); + + // Page fragments + $('div[data-load-from]').each(function() { + $(this).load($(this).attr("data-load-from")); + }); +} diff --git a/kyperkitty/static/hyperkitty/js/hyperkitty-thread.js b/kyperkitty/static/hyperkitty/js/hyperkitty-thread.js new file mode 100644 index 0000000..8f2d9af --- /dev/null +++ b/kyperkitty/static/hyperkitty/js/hyperkitty-thread.js @@ -0,0 +1,411 @@ +/* eslint no-undef: "off" */ +/* eslint no-unused-vars: "off" */ +/* + * Copyright (C) 2012-2012 by the Free Software Foundation, Inc. + * + * This file is part of HyperKitty. + * + * HyperKitty is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * HyperKitty is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * HyperKitty. If not, see . + * + * Author: Aurelien Bompard + */ + + +/* + * Categories + */ + +function setup_category() { + $(".thread-category form").submit(function (e) { + e.preventDefault(); + var widget = $(this).parents(".thread-category").first(); + $.ajax({ + type: "POST", + //dataType: "json", + data : $(this).serialize(), + url: $(this).attr("action"), + success: function(data) { + widget.html(data); + setup_category(); + }, + error: function(jqXHR, textStatus, errorThrown) { + // authentication and invalid data + alert(jqXHR.responseText); + } + }); + }); + $(".thread-category a.label").click(function(e) { + e.preventDefault(); + if ($(this).hasClass("disabled")) { + return; + } + $(this).hide() + .parents(".thread-category").first() + .find("form").show(); + }); + $(".thread-category form select").change(function() { + $(this).parents("form").first().submit(); + }); +} + + +/* + * Tagging + */ + +function setup_tags() { + function post_tags(e) { + var form = $(this); + e.preventDefault(); + $.ajax({ + type: "POST", + dataType: "json", + data : form.serialize(), + url: form.attr("action"), + success: function(data) { + $("#tags").html(data.html); + $("#tags form").submit(post_tags); + $("#tags form a").click(function(e) { + e.preventDefault(); + $(this).parents("form").first().submit(); + }); + }, + error: function(jqXHR, textStatus, errorThrown) { + // authentication and invalid data + alert(jqXHR.responseText); + }, + complete: function(jqXHR, textStatus) { + form.find("#id_tag").val(""); + } + }); + } + $("#add-tag-form").submit(post_tags); + $("#tags form").submit(post_tags); + $("#tags form a").click(function(e) { + e.preventDefault(); + $(this).parents("form").first().submit(); + }); + // Autocomplete + $("#id_tag").autocomplete({ + //minLength: 2, + source: $("#add-tag-form").attr("data-autocompleteurl") + }); +} + + +/* + * Favorites + */ + +function setup_favorites() { + $(".favorite input[name='action']").bind("change", function() { + // bind the links' visibilities to the hidden input status + var form = $(this).parents("form").first(); + if ($(this).val() === "add") { + form.find("a.saved").hide(); + form.find("a.notsaved").show(); + } else { + form.find("a.notsaved").hide(); + form.find("a.saved").show(); + } + }).trigger("change"); + $(".favorite a").bind("click", function(e) { + e.preventDefault(); + if ($(this).hasClass("disabled")) { + return; + } + var form = $(this).parents("form").first(); + var action_field = form.find("input[name='action']"); + var data = form_to_json(form); + $.ajax({ + type: "POST", + url: form.attr("action"), + dataType: "text", + data: data, + success: function(response) { + // Update the UI + if (action_field.val() === "add") { + action_field.val("rm"); + } else { + action_field.val("add"); + } + action_field.trigger("change"); + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(jqXHR.responseText); + } + }); + }); +} + + + +/* + * Replies + */ + +function setup_emails_list() { + // Attachements + $("div.container-xxl").tooltip({ + selector: ".email-info .attachments-list a", + placement: "right" + }); + // Quotes + $("div.container-xxl").on("click", 'div.email-body .quoted-switch a', function(e) { + e.preventDefault(); + $(this).parent().next(".quoted-text").slideToggle('fast'); + }); + setup_replies(); +} + +function fold_quotes(baseElem) { + $(baseElem).find('div.email-body .quoted-text').each(function() { + var linescount = $(this).text().split("\n").length; + if (linescount > 3) { + // hide if the quote is more than 3 lines long + $(this).hide(); + } + }); +} + +function setup_replies() { + $("body") + .tooltip({selector: "a.reply"}) + .on("click", "a.reply", function(e) { + e.preventDefault(); + if ($(this).hasClass("reply-mailto")) { + $(this).parent(".email-info").find(".reply-form-unauthenticated").slideToggle("fast", function() { + if ($(this).css("display") === "block") { + $(this).find("textarea").focus(); + } + }); + return; + } + $(this).parent(".email-info").find(".reply-form").slideToggle("fast", function() { + if ($(this).css("display") === "block") { + $(this).find("textarea").focus(); + } + }); + }); + $("body").on("click", "a.reply-mailto", function(e) { + // Close the reply form, we're going to use email software + var replyform = $(this).parents(".reply-form").first().slideUp(); + return; + }); + $("body").on("click", ".reply-form button[type='submit']", function(e) { + e.preventDefault(); + var button = $(this); + var form = $(this).parents("form").first(); + // remove previous error messages + form.find("div.reply-result").remove(); + var form_elements = form.find("input").add( + form.find("textarea")).add(form.find("button")); + var data = form_to_json(form); + $.ajax({ + type: "POST", + url: form.attr("action"), + dataType: "json", + data: data, + success: function(response) { + var server_reply = $(response.message_html); + if (server_reply) { + // server_reply can be null if it's a new thread + server_reply.insertAfter(form.parents(".email").first().parent()); + } + form.parents(".reply-form").first().slideUp(function() { + form.find("textarea").val(""); + if (server_reply) server_reply.slideDown(); + }); + $('

' + + response.result + '
') + .appendTo(form.parents('.email-info').first()) + .delay(2000).fadeOut('slow', function() { $(this).remove(); }); + }, + error: function(jqXHR, textStatus, errorThrown) { + $('
' + + ' ' + + jqXHR.responseText + '
') + .css("display", "none").prependTo(form).slideDown(); + }, + complete: function(jqXHR, textStatus) { + form_elements.prop("disabled", false); + } + }); + form_elements.prop("disabled", true); + }); + $("body").on("click", ".reply-form a.cancel", function(e) { + e.preventDefault(); + $(this).parents(".reply-form").first().slideUp(); + }); + $("body").on("click", ".reply-form a.quote", function(e) { + e.preventDefault(); + var quoted = $(this).parents(".email").first() + .find(".email-body").clone() + .find(".quoted-switch").remove().end() + .find(".quoted-text").text(function(index, oldText) { + return oldText.replace(/^/mg, "> "); + }).end() + .text(); + var textarea = $(this).parents(".reply-form").find("textarea"); + // remove signature + var sig_index = quoted.search(/^-- $/m); + if (sig_index != -1) { + quoted = quoted.substr(0, sig_index); + } + // set reply attribution + var attribution = $(this).parents(".email").first() + .find(".email-author .name").clone().text(); + // add quotation marks + quoted = $.trim(quoted).replace(/^/mg, "> "); + // insert before any previous text + textarea.val($.trim(attribution) + " wrote:\n" + quoted + "\n" + textarea.val()); + textarea.focus(); + }); + function set_new_thread(checkbox) { + var this_form = checkbox.closest("form"); + var subj = this_form.find("p.new-subject"); + if (checkbox.is(":checked")) { + subj.slideDown("fast"); + subj.find("input").focus(); + } else { + subj.slideUp("fast"); + this_form.find("textarea").focus(); + } + } + $("body").on("change", ".reply-form input[name='newthread']", function() { + set_new_thread($(this)); + }); +} + +function setup_unreadnavbar(element) { + element = $(element); + if (element.length === 0) { + return; + } + var current_index; + function scroll(inc) { + var unreads = $(".email.unread"); + if (unreads.length == 0) { return; } + if (typeof current_index == "undefined") { + if (inc == 1) { current_index = -1; } + if (inc == -1) { current_index = unreads.length; } + } + current_index = current_index + inc; + if (current_index < 0) { current_index = unreads.length - 1; } + if (current_index >= unreads.length) { current_index = 0; } + element.find(".unreadindex").text(current_index + 1); + // compensate for the fixed banner at the top + var target = unreads.eq(current_index).offset().top - 70; + $("html,body").stop(true, false).animate({ + scrollTop: target + }, 500); + } + element.find(".nextunread").click(function(e) { e.preventDefault(); scroll(1); }); + element.find(".prevunread").click(function(e) { e.preventDefault(); scroll(-1); }); + $(document).bind("keydown", "j", function(e) { scroll(1); }); + $(document).bind("keydown", "k", function(e) { scroll(-1); }); + element.find("a").tooltip(); + element.animate({height: "show"}, 700); +} + + + +/* + * Thread replies list + * Updates the list of replies in a thread chunk-by-chunk to avoid blocking the + * UI + */ + +function update_thread_replies(url) { + function load_more(current_url) { + $.ajax({ + dataType: "json", + url: current_url, + success: function(data) { + // replies + var newcontent = $(data.replies_html); + $(".replies").append(newcontent) + .append($(".replies .ajaxloader")); + fold_quotes(newcontent); + // load the rest if applicable + if (data.more_pending) { + load_more(url+"&offset="+data.next_offset); + } else { + $(".replies .ajaxloader").remove(); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + if (jqXHR.responseText !== "") { + alert(jqXHR.responseText); + } + } + }); + } + load_more(url); +} + + +/* + * Re-attach threads + */ +function setup_reattach() { + $(".reattach-thread li.manual input[type='text']").focus( function() { + $(this).parents("li").first() + .find("input[type='radio']") + .prop("checked", true); + }); + $(".reattach-thread form.search").submit(function (e) { + e.preventDefault(); + var results_elem = $(this).parent().find("ul.suggestions"); + var url = $(this).attr("action") + "?" + $(this).serialize(); + results_elem.find("img.ajaxloader").show(); + $.ajax({ + url: url, + success: function(data) { + results_elem.html(data); + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(jqXHR.responseText); + }, + complete: function(jqXHR, textStatus) { + results_elem.find("img.ajaxloader").hide(); + } + }); + }).submit(); +} + + +/* + * Handle click on the "fixed-font" toggle. + */ +function setup_fixed_font() { + $(document).on("click", ".toggle-font", function() { + $(this).parents('.email').find('.email-body').toggleClass('fixed') + }); +} + + +/* + * Setup keyboard shortcuts. + */ + +function setup_thread_keyboard_shortcuts() { + // First, setup the shortcut to goto all threads. + Mousetrap.bind('j a', function() { + window.location.href = '../../latest'; + }); + Mousetrap.bind('j l', function() { + window.location.href = '../../'; + }); +} diff --git a/kyperkitty/static/hyperkitty/js/hyperkitty-userprofile.js b/kyperkitty/static/hyperkitty/js/hyperkitty-userprofile.js new file mode 100644 index 0000000..f1f6f71 --- /dev/null +++ b/kyperkitty/static/hyperkitty/js/hyperkitty-userprofile.js @@ -0,0 +1,71 @@ +/* eslint no-undef: "off" */ +/* eslint no-unused-vars: "off" */ + +/* + * Copyright (C) 2012-2012 by the Free Software Foundation, Inc. + * + * This file is part of HyperKitty. + * + * HyperKitty is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * HyperKitty is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * HyperKitty. If not, see . + * + * Author: Aurelien Bompard + */ + + +/* + * Last viewed threads and votes in the user's profile + */ +function update_user_profile_part(container) { + container = $(container); + base_url = container.attr("data-load-from"); + var loader = container.parent().find(".ajaxloader"); + function _update(url) { + loader.show(); + $.ajax({ + url: url, + success: function(data) { + container.html(data); + container.find(".pagination a").click(function(e) { + e.preventDefault(); + _update(base_url + $(this).attr("href")); + }); + // setup cancellation links + container.find("a.cancel").click(function(e) { + e.preventDefault(); + var form = $(this).parents("form").first(); + var data = form_to_json(form); + $.ajax({ + type: "POST", + url: form.attr("action"), + data: data, + dataType: "json", + success: function(response) { + form.parents("tr").remove(); + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(jqXHR.responseText); + } + }); + }); + }, + error: function(jqXHR, textStatus, errorThrown) { + //alert(jqXHR.responseText); + }, + complete: function(jqXHR, textStatus) { + loader.hide(); + } + }); + } + _update(base_url); +} diff --git a/kyperkitty/static/hyperkitty/libs/bootstrap/README.txt b/kyperkitty/static/hyperkitty/libs/bootstrap/README.txt new file mode 100644 index 0000000..d036f54 --- /dev/null +++ b/kyperkitty/static/hyperkitty/libs/bootstrap/README.txt @@ -0,0 +1,3 @@ +This directory is an extraction of +https://github.com/twbs/bootstrap-sass/tree/master/assets, except for the 3.3.5 +directory which contains the officially distributed Bootstrap CSS files. diff --git a/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot b/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 \ No newline at end of file diff --git a/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf b/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/kyperkitty/static/hyperkitty/libs/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.js b/kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.js new file mode 100644 index 0000000..e5d26a2 --- /dev/null +++ b/kyperkitty/static/hyperkitty/libs/bootstrap/javascripts/bootstrap.bundle.js @@ -0,0 +1,6812 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory()); +})(this, (function () { 'use strict'; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const MAX_UID = 1000000; + const MILLISECONDS_MULTIPLIER = 1000; + const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + const toType = obj => { + if (obj === null || obj === undefined) { + return `${obj}`; + } + + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + }; + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + const getUID = prefix => { + do { + prefix += Math.floor(Math.random() * MAX_UID); + } while (document.getElementById(prefix)); + + return prefix; + }; + + const getSelector = element => { + let selector = element.getAttribute('data-bs-target'); + + if (!selector || selector === '#') { + let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + + if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) { + return null; + } // Just in case some CMS puts out a full URL with the anchor appended + + + if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) { + hrefAttr = `#${hrefAttr.split('#')[1]}`; + } + + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null; + } + + return selector; + }; + + const getSelectorFromElement = element => { + const selector = getSelector(element); + + if (selector) { + return document.querySelector(selector) ? selector : null; + } + + return null; + }; + + const getElementFromSelector = element => { + const selector = getSelector(element); + return selector ? document.querySelector(selector) : null; + }; + + const getTransitionDurationFromElement = element => { + if (!element) { + return 0; + } // Get transition-duration of the element + + + let { + transitionDuration, + transitionDelay + } = window.getComputedStyle(element); + const floatTransitionDuration = Number.parseFloat(transitionDuration); + const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }; + + const triggerTransitionEnd = element => { + element.dispatchEvent(new Event(TRANSITION_END)); + }; + + const isElement$1 = obj => { + if (!obj || typeof obj !== 'object') { + return false; + } + + if (typeof obj.jquery !== 'undefined') { + obj = obj[0]; + } + + return typeof obj.nodeType !== 'undefined'; + }; + + const getElement = obj => { + if (isElement$1(obj)) { + // it's a jQuery object or a node element + return obj.jquery ? obj[0] : obj; + } + + if (typeof obj === 'string' && obj.length > 0) { + return document.querySelector(obj); + } + + return null; + }; + + const typeCheckConfig = (componentName, config, configTypes) => { + Object.keys(configTypes).forEach(property => { + const expectedTypes = configTypes[property]; + const value = config[property]; + const valueType = value && isElement$1(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); + } + }); + }; + + const isVisible = element => { + if (!isElement$1(element) || element.getClientRects().length === 0) { + return false; + } + + return getComputedStyle(element).getPropertyValue('visibility') === 'visible'; + }; + + const isDisabled = element => { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return true; + } + + if (element.classList.contains('disabled')) { + return true; + } + + if (typeof element.disabled !== 'undefined') { + return element.disabled; + } + + return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; + }; + + const findShadowRoot = element => { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + const root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return findShadowRoot(element.parentNode); + }; + + const noop = () => {}; + /** + * Trick to restart an element's animation + * + * @param {HTMLElement} element + * @return void + * + * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation + */ + + + const reflow = element => { + // eslint-disable-next-line no-unused-expressions + element.offsetHeight; + }; + + const getjQuery = () => { + const { + jQuery + } = window; + + if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { + return jQuery; + } + + return null; + }; + + const DOMContentLoadedCallbacks = []; + + const onDOMContentLoaded = callback => { + if (document.readyState === 'loading') { + // add listener on the first call when the document is in loading state + if (!DOMContentLoadedCallbacks.length) { + document.addEventListener('DOMContentLoaded', () => { + DOMContentLoadedCallbacks.forEach(callback => callback()); + }); + } + + DOMContentLoadedCallbacks.push(callback); + } else { + callback(); + } + }; + + const isRTL = () => document.documentElement.dir === 'rtl'; + + const defineJQueryPlugin = plugin => { + onDOMContentLoaded(() => { + const $ = getjQuery(); + /* istanbul ignore if */ + + if ($) { + const name = plugin.NAME; + const JQUERY_NO_CONFLICT = $.fn[name]; + $.fn[name] = plugin.jQueryInterface; + $.fn[name].Constructor = plugin; + + $.fn[name].noConflict = () => { + $.fn[name] = JQUERY_NO_CONFLICT; + return plugin.jQueryInterface; + }; + } + }); + }; + + const execute = callback => { + if (typeof callback === 'function') { + callback(); + } + }; + + const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { + if (!waitForTransition) { + execute(callback); + return; + } + + const durationPadding = 5; + const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; + let called = false; + + const handler = ({ + target + }) => { + if (target !== transitionElement) { + return; + } + + called = true; + transitionElement.removeEventListener(TRANSITION_END, handler); + execute(callback); + }; + + transitionElement.addEventListener(TRANSITION_END, handler); + setTimeout(() => { + if (!called) { + triggerTransitionEnd(transitionElement); + } + }, emulatedDuration); + }; + /** + * Return the previous/next element of a list. + * + * @param {array} list The list of elements + * @param activeElement The active element + * @param shouldGetNext Choose to get next or previous element + * @param isCycleAllowed + * @return {Element|elem} The proper element + */ + + + const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { + let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed + + if (index === -1) { + return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]; + } + + const listLength = list.length; + index += shouldGetNext ? 1 : -1; + + if (isCycleAllowed) { + index = (index + listLength) % listLength; + } + + return list[Math.max(0, Math.min(index, listLength - 1))]; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): dom/event-handler.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const namespaceRegex = /[^.]*(?=\..*)\.|.*/; + const stripNameRegex = /\..*/; + const stripUidRegex = /::\d+$/; + const eventRegistry = {}; // Events storage + + let uidEvent = 1; + const customEvents = { + mouseenter: 'mouseover', + mouseleave: 'mouseout' + }; + const customEventsRegex = /^(mouseenter|mouseleave)/i; + const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']); + /** + * ------------------------------------------------------------------------ + * Private methods + * ------------------------------------------------------------------------ + */ + + function getUidEvent(element, uid) { + return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; + } + + function getEvent(element) { + const uid = getUidEvent(element); + element.uidEvent = uid; + eventRegistry[uid] = eventRegistry[uid] || {}; + return eventRegistry[uid]; + } + + function bootstrapHandler(element, fn) { + return function handler(event) { + event.delegateTarget = element; + + if (handler.oneOff) { + EventHandler.off(element, event.type, fn); + } + + return fn.apply(element, [event]); + }; + } + + function bootstrapDelegationHandler(element, selector, fn) { + return function handler(event) { + const domElements = element.querySelectorAll(selector); + + for (let { + target + } = event; target && target !== this; target = target.parentNode) { + for (let i = domElements.length; i--;) { + if (domElements[i] === target) { + event.delegateTarget = target; + + if (handler.oneOff) { + EventHandler.off(element, event.type, selector, fn); + } + + return fn.apply(target, [event]); + } + } + } // To please ESLint + + + return null; + }; + } + + function findHandler(events, handler, delegationSelector = null) { + const uidEventList = Object.keys(events); + + for (let i = 0, len = uidEventList.length; i < len; i++) { + const event = events[uidEventList[i]]; + + if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { + return event; + } + } + + return null; + } + + function normalizeParams(originalTypeEvent, handler, delegationFn) { + const delegation = typeof handler === 'string'; + const originalHandler = delegation ? delegationFn : handler; + let typeEvent = getTypeEvent(originalTypeEvent); + const isNative = nativeEvents.has(typeEvent); + + if (!isNative) { + typeEvent = originalTypeEvent; + } + + return [delegation, originalHandler, typeEvent]; + } + + function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + + if (!handler) { + handler = delegationFn; + delegationFn = null; + } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position + // this prevents the handler from being dispatched the same way as mouseover or mouseout does + + + if (customEventsRegex.test(originalTypeEvent)) { + const wrapFn = fn => { + return function (event) { + if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { + return fn.call(this, event); + } + }; + }; + + if (delegationFn) { + delegationFn = wrapFn(delegationFn); + } else { + handler = wrapFn(handler); + } + } + + const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn); + const events = getEvent(element); + const handlers = events[typeEvent] || (events[typeEvent] = {}); + const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null); + + if (previousFn) { + previousFn.oneOff = previousFn.oneOff && oneOff; + return; + } + + const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')); + const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler); + fn.delegationSelector = delegation ? handler : null; + fn.originalHandler = originalHandler; + fn.oneOff = oneOff; + fn.uidEvent = uid; + handlers[uid] = fn; + element.addEventListener(typeEvent, fn, delegation); + } + + function removeHandler(element, events, typeEvent, handler, delegationSelector) { + const fn = findHandler(events[typeEvent], handler, delegationSelector); + + if (!fn) { + return; + } + + element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); + delete events[typeEvent][fn.uidEvent]; + } + + function removeNamespacedHandlers(element, events, typeEvent, namespace) { + const storeElementEvent = events[typeEvent] || {}; + Object.keys(storeElementEvent).forEach(handlerKey => { + if (handlerKey.includes(namespace)) { + const event = storeElementEvent[handlerKey]; + removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); + } + }); + } + + function getTypeEvent(event) { + // allow to get the native events from namespaced events ('click.bs.button' --> 'click') + event = event.replace(stripNameRegex, ''); + return customEvents[event] || event; + } + + const EventHandler = { + on(element, event, handler, delegationFn) { + addHandler(element, event, handler, delegationFn, false); + }, + + one(element, event, handler, delegationFn) { + addHandler(element, event, handler, delegationFn, true); + }, + + off(element, originalTypeEvent, handler, delegationFn) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + + const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn); + const inNamespace = typeEvent !== originalTypeEvent; + const events = getEvent(element); + const isNamespace = originalTypeEvent.startsWith('.'); + + if (typeof originalHandler !== 'undefined') { + // Simplest case: handler is passed, remove that listener ONLY. + if (!events || !events[typeEvent]) { + return; + } + + removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null); + return; + } + + if (isNamespace) { + Object.keys(events).forEach(elementEvent => { + removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); + }); + } + + const storeElementEvent = events[typeEvent] || {}; + Object.keys(storeElementEvent).forEach(keyHandlers => { + const handlerKey = keyHandlers.replace(stripUidRegex, ''); + + if (!inNamespace || originalTypeEvent.includes(handlerKey)) { + const event = storeElementEvent[keyHandlers]; + removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); + } + }); + }, + + trigger(element, event, args) { + if (typeof event !== 'string' || !element) { + return null; + } + + const $ = getjQuery(); + const typeEvent = getTypeEvent(event); + const inNamespace = event !== typeEvent; + const isNative = nativeEvents.has(typeEvent); + let jQueryEvent; + let bubbles = true; + let nativeDispatch = true; + let defaultPrevented = false; + let evt = null; + + if (inNamespace && $) { + jQueryEvent = $.Event(event, args); + $(element).trigger(jQueryEvent); + bubbles = !jQueryEvent.isPropagationStopped(); + nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); + defaultPrevented = jQueryEvent.isDefaultPrevented(); + } + + if (isNative) { + evt = document.createEvent('HTMLEvents'); + evt.initEvent(typeEvent, bubbles, true); + } else { + evt = new CustomEvent(event, { + bubbles, + cancelable: true + }); + } // merge custom information in our event + + + if (typeof args !== 'undefined') { + Object.keys(args).forEach(key => { + Object.defineProperty(evt, key, { + get() { + return args[key]; + } + + }); + }); + } + + if (defaultPrevented) { + evt.preventDefault(); + } + + if (nativeDispatch) { + element.dispatchEvent(evt); + } + + if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') { + jQueryEvent.preventDefault(); + } + + return evt; + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): dom/data.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + const elementMap = new Map(); + const Data = { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()); + } + + const instanceMap = elementMap.get(element); // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); + return; + } + + instanceMap.set(key, instance); + }, + + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null; + } + + return null; + }, + + remove(element, key) { + if (!elementMap.has(element)) { + return; + } + + const instanceMap = elementMap.get(element); + instanceMap.delete(key); // free up element references if there are no instances left for an element + + if (instanceMap.size === 0) { + elementMap.delete(element); + } + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): base-component.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const VERSION = '5.1.3'; + + class BaseComponent { + constructor(element) { + element = getElement(element); + + if (!element) { + return; + } + + this._element = element; + Data.set(this._element, this.constructor.DATA_KEY, this); + } + + dispose() { + Data.remove(this._element, this.constructor.DATA_KEY); + EventHandler.off(this._element, this.constructor.EVENT_KEY); + Object.getOwnPropertyNames(this).forEach(propertyName => { + this[propertyName] = null; + }); + } + + _queueCallback(callback, element, isAnimated = true) { + executeAfterTransition(callback, element, isAnimated); + } + /** Static */ + + + static getInstance(element) { + return Data.get(getElement(element), this.DATA_KEY); + } + + static getOrCreateInstance(element, config = {}) { + return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); + } + + static get VERSION() { + return VERSION; + } + + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!'); + } + + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/component-functions.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const enableDismissTrigger = (component, method = 'hide') => { + const clickEvent = `click.dismiss${component.EVENT_KEY}`; + const name = component.NAME; + EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) { + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + if (isDisabled(this)) { + return; + } + + const target = getElementFromSelector(this) || this.closest(`.${name}`); + const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method + + instance[method](); + }); + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): alert.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$d = 'alert'; + const DATA_KEY$c = 'bs.alert'; + const EVENT_KEY$c = `.${DATA_KEY$c}`; + const EVENT_CLOSE = `close${EVENT_KEY$c}`; + const EVENT_CLOSED = `closed${EVENT_KEY$c}`; + const CLASS_NAME_FADE$5 = 'fade'; + const CLASS_NAME_SHOW$8 = 'show'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Alert extends BaseComponent { + // Getters + static get NAME() { + return NAME$d; + } // Public + + + close() { + const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); + + if (closeEvent.defaultPrevented) { + return; + } + + this._element.classList.remove(CLASS_NAME_SHOW$8); + + const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5); + + this._queueCallback(() => this._destroyElement(), this._element, isAnimated); + } // Private + + + _destroyElement() { + this._element.remove(); + + EventHandler.trigger(this._element, EVENT_CLOSED); + this.dispose(); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Alert.getOrCreateInstance(this); + + if (typeof config !== 'string') { + return; + } + + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](this); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + enableDismissTrigger(Alert, 'close'); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Alert to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Alert); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): button.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$c = 'button'; + const DATA_KEY$b = 'bs.button'; + const EVENT_KEY$b = `.${DATA_KEY$b}`; + const DATA_API_KEY$7 = '.data-api'; + const CLASS_NAME_ACTIVE$3 = 'active'; + const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; + const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Button extends BaseComponent { + // Getters + static get NAME() { + return NAME$c; + } // Public + + + toggle() { + // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method + this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Button.getOrCreateInstance(this); + + if (config === 'toggle') { + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => { + event.preventDefault(); + const button = event.target.closest(SELECTOR_DATA_TOGGLE$5); + const data = Button.getOrCreateInstance(button); + data.toggle(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Button to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Button); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): dom/manipulator.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + function normalizeData(val) { + if (val === 'true') { + return true; + } + + if (val === 'false') { + return false; + } + + if (val === Number(val).toString()) { + return Number(val); + } + + if (val === '' || val === 'null') { + return null; + } + + return val; + } + + function normalizeDataKey(key) { + return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); + } + + const Manipulator = { + setDataAttribute(element, key, value) { + element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); + }, + + removeDataAttribute(element, key) { + element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); + }, + + getDataAttributes(element) { + if (!element) { + return {}; + } + + const attributes = {}; + Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => { + let pureKey = key.replace(/^bs/, ''); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + attributes[pureKey] = normalizeData(element.dataset[key]); + }); + return attributes; + }, + + getDataAttribute(element, key) { + return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); + }, + + offset(element) { + const rect = element.getBoundingClientRect(); + return { + top: rect.top + window.pageYOffset, + left: rect.left + window.pageXOffset + }; + }, + + position(element) { + return { + top: element.offsetTop, + left: element.offsetLeft + }; + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): dom/selector-engine.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const NODE_TEXT = 3; + const SelectorEngine = { + find(selector, element = document.documentElement) { + return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); + }, + + findOne(selector, element = document.documentElement) { + return Element.prototype.querySelector.call(element, selector); + }, + + children(element, selector) { + return [].concat(...element.children).filter(child => child.matches(selector)); + }, + + parents(element, selector) { + const parents = []; + let ancestor = element.parentNode; + + while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { + if (ancestor.matches(selector)) { + parents.push(ancestor); + } + + ancestor = ancestor.parentNode; + } + + return parents; + }, + + prev(element, selector) { + let previous = element.previousElementSibling; + + while (previous) { + if (previous.matches(selector)) { + return [previous]; + } + + previous = previous.previousElementSibling; + } + + return []; + }, + + next(element, selector) { + let next = element.nextElementSibling; + + while (next) { + if (next.matches(selector)) { + return [next]; + } + + next = next.nextElementSibling; + } + + return []; + }, + + focusableChildren(element) { + const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', '); + return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)); + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): carousel.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$b = 'carousel'; + const DATA_KEY$a = 'bs.carousel'; + const EVENT_KEY$a = `.${DATA_KEY$a}`; + const DATA_API_KEY$6 = '.data-api'; + const ARROW_LEFT_KEY = 'ArrowLeft'; + const ARROW_RIGHT_KEY = 'ArrowRight'; + const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + const SWIPE_THRESHOLD = 40; + const Default$a = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + const DefaultType$a = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + const ORDER_NEXT = 'next'; + const ORDER_PREV = 'prev'; + const DIRECTION_LEFT = 'left'; + const DIRECTION_RIGHT = 'right'; + const KEY_TO_DIRECTION = { + [ARROW_LEFT_KEY]: DIRECTION_RIGHT, + [ARROW_RIGHT_KEY]: DIRECTION_LEFT + }; + const EVENT_SLIDE = `slide${EVENT_KEY$a}`; + const EVENT_SLID = `slid${EVENT_KEY$a}`; + const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`; + const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`; + const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`; + const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`; + const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`; + const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`; + const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`; + const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`; + const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`; + const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`; + const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`; + const CLASS_NAME_CAROUSEL = 'carousel'; + const CLASS_NAME_ACTIVE$2 = 'active'; + const CLASS_NAME_SLIDE = 'slide'; + const CLASS_NAME_END = 'carousel-item-end'; + const CLASS_NAME_START = 'carousel-item-start'; + const CLASS_NAME_NEXT = 'carousel-item-next'; + const CLASS_NAME_PREV = 'carousel-item-prev'; + const CLASS_NAME_POINTER_EVENT = 'pointer-event'; + const SELECTOR_ACTIVE$1 = '.active'; + const SELECTOR_ACTIVE_ITEM = '.active.carousel-item'; + const SELECTOR_ITEM = '.carousel-item'; + const SELECTOR_ITEM_IMG = '.carousel-item img'; + const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; + const SELECTOR_INDICATORS = '.carousel-indicators'; + const SELECTOR_INDICATOR = '[data-bs-target]'; + const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; + const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; + const POINTER_TYPE_TOUCH = 'touch'; + const POINTER_TYPE_PEN = 'pen'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Carousel extends BaseComponent { + constructor(element, config) { + super(element); + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent); + + this._addEventListeners(); + } // Getters + + + static get Default() { + return Default$a; + } + + static get NAME() { + return NAME$b; + } // Public + + + next() { + this._slide(ORDER_NEXT); + } + + nextWhenVisible() { + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && isVisible(this._element)) { + this.next(); + } + } + + prev() { + this._slide(ORDER_PREV); + } + + pause(event) { + if (!event) { + this._isPaused = true; + } + + if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) { + triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + } + + cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config && this._config.interval && !this._isPaused) { + this._updateInterval(); + + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + } + + to(index) { + this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + const activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.to(index)); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; + + this._slide(order, this._items[index]); + } // Private + + + _getConfig(config) { + config = { ...Default$a, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$b, config, DefaultType$a); + return config; + } + + _handleSwipe() { + const absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + const direction = absDeltax / this.touchDeltaX; + this.touchDeltaX = 0; + + if (!direction) { + return; + } + + this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT); + } + + _addEventListeners() { + if (this._config.keyboard) { + EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event)); + } + + if (this._config.pause === 'hover') { + EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event)); + EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event)); + } + + if (this._config.touch && this._touchSupported) { + this._addTouchEventListeners(); + } + } + + _addTouchEventListeners() { + const hasPointerPenTouch = event => { + return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH); + }; + + const start = event => { + if (hasPointerPenTouch(event)) { + this.touchStartX = event.clientX; + } else if (!this._pointerEvent) { + this.touchStartX = event.touches[0].clientX; + } + }; + + const move = event => { + // ensure swiping with one touch and not pinching + this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX; + }; + + const end = event => { + if (hasPointerPenTouch(event)) { + this.touchDeltaX = event.clientX - this.touchStartX; + } + + this._handleSwipe(); + + if (this._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + this.pause(); + + if (this.touchTimeout) { + clearTimeout(this.touchTimeout); + } + + this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval); + } + }; + + SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => { + EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault()); + }); + + if (this._pointerEvent) { + EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event)); + EventHandler.on(this._element, EVENT_POINTERUP, event => end(event)); + + this._element.classList.add(CLASS_NAME_POINTER_EVENT); + } else { + EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event)); + EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event)); + EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event)); + } + } + + _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + const direction = KEY_TO_DIRECTION[event.key]; + + if (direction) { + event.preventDefault(); + + this._slide(direction); + } + } + + _getItemIndex(element) { + this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : []; + return this._items.indexOf(element); + } + + _getItemByOrder(order, activeElement) { + const isNext = order === ORDER_NEXT; + return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap); + } + + _triggerSlideEvent(relatedTarget, eventDirectionName) { + const targetIndex = this._getItemIndex(relatedTarget); + + const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)); + + return EventHandler.trigger(this._element, EVENT_SLIDE, { + relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + } + + _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement); + activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); + activeIndicator.removeAttribute('aria-current'); + const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement); + + for (let i = 0; i < indicators.length; i++) { + if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) { + indicators[i].classList.add(CLASS_NAME_ACTIVE$2); + indicators[i].setAttribute('aria-current', 'true'); + break; + } + } + } + } + + _updateInterval() { + const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + if (!element) { + return; + } + + const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); + + if (elementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = elementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + } + + _slide(directionOrOrder, element) { + const order = this._directionToOrder(directionOrOrder); + + const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + const activeElementIndex = this._getItemIndex(activeElement); + + const nextElement = element || this._getItemByOrder(order, activeElement); + + const nextElementIndex = this._getItemIndex(nextElement); + + const isCycling = Boolean(this._interval); + const isNext = order === ORDER_NEXT; + const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; + const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; + + const eventDirectionName = this._orderToDirection(order); + + if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) { + this._isSliding = false; + return; + } + + if (this._isSliding) { + return; + } + + const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.defaultPrevented) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + this._activeElement = nextElement; + + const triggerSlidEvent = () => { + EventHandler.trigger(this._element, EVENT_SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + }; + + if (this._element.classList.contains(CLASS_NAME_SLIDE)) { + nextElement.classList.add(orderClassName); + reflow(nextElement); + activeElement.classList.add(directionalClassName); + nextElement.classList.add(directionalClassName); + + const completeCallBack = () => { + nextElement.classList.remove(directionalClassName, orderClassName); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); + this._isSliding = false; + setTimeout(triggerSlidEvent, 0); + }; + + this._queueCallback(completeCallBack, activeElement, true); + } else { + activeElement.classList.remove(CLASS_NAME_ACTIVE$2); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + this._isSliding = false; + triggerSlidEvent(); + } + + if (isCycling) { + this.cycle(); + } + } + + _directionToOrder(direction) { + if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) { + return direction; + } + + if (isRTL()) { + return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; + } + + return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; + } + + _orderToDirection(order) { + if (![ORDER_NEXT, ORDER_PREV].includes(order)) { + return order; + } + + if (isRTL()) { + return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + + return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; + } // Static + + + static carouselInterface(element, config) { + const data = Carousel.getOrCreateInstance(element, config); + let { + _config + } = data; + + if (typeof config === 'object') { + _config = { ..._config, + ...config + }; + } + + const action = typeof config === 'string' ? config : _config.slide; + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError(`No method named "${action}"`); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + } + + static jQueryInterface(config) { + return this.each(function () { + Carousel.carouselInterface(this, config); + }); + } + + static dataApiClickHandler(event) { + const target = getElementFromSelector(this); + + if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { + return; + } + + const config = { ...Manipulator.getDataAttributes(target), + ...Manipulator.getDataAttributes(this) + }; + const slideIndex = this.getAttribute('data-bs-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel.carouselInterface(target, config); + + if (slideIndex) { + Carousel.getInstance(target).to(slideIndex); + } + + event.preventDefault(); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler); + EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => { + const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); + + for (let i = 0, len = carousels.length; i < len; i++) { + Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i])); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Carousel to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Carousel); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): collapse.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$a = 'collapse'; + const DATA_KEY$9 = 'bs.collapse'; + const EVENT_KEY$9 = `.${DATA_KEY$9}`; + const DATA_API_KEY$5 = '.data-api'; + const Default$9 = { + toggle: true, + parent: null + }; + const DefaultType$9 = { + toggle: 'boolean', + parent: '(null|element)' + }; + const EVENT_SHOW$5 = `show${EVENT_KEY$9}`; + const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`; + const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`; + const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`; + const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`; + const CLASS_NAME_SHOW$7 = 'show'; + const CLASS_NAME_COLLAPSE = 'collapse'; + const CLASS_NAME_COLLAPSING = 'collapsing'; + const CLASS_NAME_COLLAPSED = 'collapsed'; + const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; + const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; + const WIDTH = 'width'; + const HEIGHT = 'height'; + const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; + const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Collapse extends BaseComponent { + constructor(element, config) { + super(element); + this._isTransitioning = false; + this._config = this._getConfig(config); + this._triggerArray = []; + const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); + + for (let i = 0, len = toggleList.length; i < len; i++) { + const elem = toggleList[i]; + const selector = getSelectorFromElement(elem); + const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element); + + if (selector !== null && filterElement.length) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._initializeChildren(); + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + static get Default() { + return Default$9; + } + + static get NAME() { + return NAME$a; + } // Public + + + toggle() { + if (this._isShown()) { + this.hide(); + } else { + this.show(); + } + } + + show() { + if (this._isTransitioning || this._isShown()) { + return; + } + + let actives = []; + let activesData; + + if (this._config.parent) { + const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); + actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth + } + + const container = SelectorEngine.findOne(this._selector); + + if (actives.length) { + const tempActiveData = actives.find(elem => container !== elem); + activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null; + + if (activesData && activesData._isTransitioning) { + return; + } + } + + const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5); + + if (startEvent.defaultPrevented) { + return; + } + + actives.forEach(elemActive => { + if (container !== elemActive) { + Collapse.getOrCreateInstance(elemActive, { + toggle: false + }).hide(); + } + + if (!activesData) { + Data.set(elemActive, DATA_KEY$9, null); + } + }); + + const dimension = this._getDimension(); + + this._element.classList.remove(CLASS_NAME_COLLAPSE); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.style[dimension] = 0; + + this._addAriaAndCollapsedClass(this._triggerArray, true); + + this._isTransitioning = true; + + const complete = () => { + this._isTransitioning = false; + + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + + this._element.style[dimension] = ''; + EventHandler.trigger(this._element, EVENT_SHOWN$5); + }; + + const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + const scrollSize = `scroll${capitalizedDimension}`; + + this._queueCallback(complete, this._element, true); + + this._element.style[dimension] = `${this._element[scrollSize]}px`; + } + + hide() { + if (this._isTransitioning || !this._isShown()) { + return; + } + + const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5); + + if (startEvent.defaultPrevented) { + return; + } + + const dimension = this._getDimension(); + + this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; + reflow(this._element); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + + const triggerArrayLength = this._triggerArray.length; + + for (let i = 0; i < triggerArrayLength; i++) { + const trigger = this._triggerArray[i]; + const elem = getElementFromSelector(trigger); + + if (elem && !this._isShown(elem)) { + this._addAriaAndCollapsedClass([trigger], false); + } + } + + this._isTransitioning = true; + + const complete = () => { + this._isTransitioning = false; + + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE); + + EventHandler.trigger(this._element, EVENT_HIDDEN$5); + }; + + this._element.style[dimension] = ''; + + this._queueCallback(complete, this._element, true); + } + + _isShown(element = this._element) { + return element.classList.contains(CLASS_NAME_SHOW$7); + } // Private + + + _getConfig(config) { + config = { ...Default$9, + ...Manipulator.getDataAttributes(this._element), + ...config + }; + config.toggle = Boolean(config.toggle); // Coerce string values + + config.parent = getElement(config.parent); + typeCheckConfig(NAME$a, config, DefaultType$9); + return config; + } + + _getDimension() { + return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; + } + + _initializeChildren() { + if (!this._config.parent) { + return; + } + + const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); + SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => { + const selected = getElementFromSelector(element); + + if (selected) { + this._addAriaAndCollapsedClass([element], this._isShown(selected)); + } + }); + } + + _addAriaAndCollapsedClass(triggerArray, isOpen) { + if (!triggerArray.length) { + return; + } + + triggerArray.forEach(elem => { + if (isOpen) { + elem.classList.remove(CLASS_NAME_COLLAPSED); + } else { + elem.classList.add(CLASS_NAME_COLLAPSED); + } + + elem.setAttribute('aria-expanded', isOpen); + }); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const _config = {}; + + if (typeof config === 'string' && /show|hide/.test(config)) { + _config.toggle = false; + } + + const data = Collapse.getOrCreateInstance(this, _config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { + event.preventDefault(); + } + + const selector = getSelectorFromElement(this); + const selectorElements = SelectorEngine.find(selector); + selectorElements.forEach(element => { + Collapse.getOrCreateInstance(element, { + toggle: false + }).toggle(); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Collapse to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Collapse); + + var top = 'top'; + var bottom = 'bottom'; + var right = 'right'; + var left = 'left'; + var auto = 'auto'; + var basePlacements = [top, bottom, right, left]; + var start = 'start'; + var end = 'end'; + var clippingParents = 'clippingParents'; + var viewport = 'viewport'; + var popper = 'popper'; + var reference = 'reference'; + var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); + }, []); + var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); + }, []); // modifiers that need to read the DOM + + var beforeRead = 'beforeRead'; + var read = 'read'; + var afterRead = 'afterRead'; // pure-logic modifiers + + var beforeMain = 'beforeMain'; + var main = 'main'; + var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + + var beforeWrite = 'beforeWrite'; + var write = 'write'; + var afterWrite = 'afterWrite'; + var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + + function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; + } + + function getWindow(node) { + if (node == null) { + return window; + } + + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + + return node; + } + + function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; + } + + function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; + } + + function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } + + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; + } + + // and applies them to the HTMLElements such as popper and arrow + + function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] + + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; + + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); + } + + function effect$2(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); + }); + }; + } // eslint-disable-next-line import/no-unused-modules + + + const applyStyles$1 = { + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: effect$2, + requires: ['computeStyles'] + }; + + function getBasePlacement(placement) { + return placement.split('-')[0]; + } + + // import { isHTMLElement } from './instanceOf'; + function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars + includeScale) { + + var rect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; // FIXME: + // `offsetWidth` returns an integer while `getBoundingClientRect` + // returns a float. This results in `scaleX` or `scaleY` being + // non-1 when it should be for elements that aren't a full pixel in + // width or height. + // if (isHTMLElement(element) && includeScale) { + // const offsetHeight = element.offsetHeight; + // const offsetWidth = element.offsetWidth; + // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale + // // Fallback to 1 in case both values are `0` + // if (offsetWidth > 0) { + // scaleX = rect.width / offsetWidth || 1; + // } + // if (offsetHeight > 0) { + // scaleY = rect.height / offsetHeight || 1; + // } + // } + + return { + width: rect.width / scaleX, + height: rect.height / scaleY, + top: rect.top / scaleY, + right: rect.right / scaleX, + bottom: rect.bottom / scaleY, + left: rect.left / scaleX, + x: rect.left / scaleX, + y: rect.top / scaleY + }; + } + + // means it doesn't take into account transforms. + + function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; + } + + function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; + } + + function getComputedStyle$1(element) { + return getWindow(element).getComputedStyle(element); + } + + function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; + } + + function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; + } + + function getParentNode(element) { + if (getNodeName(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) // fallback + + ); + } + + function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle$1(element).position === 'fixed') { + return null; + } + + return element.offsetParent; + } // `.offsetParent` reports `null` for fixed elements, while absolute elements + // return the containing block + + + function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; + var isIE = navigator.userAgent.indexOf('Trident') !== -1; + + if (isIE && isHTMLElement(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = getComputedStyle$1(element); + + if (elementCss.position === 'fixed') { + return null; + } + } + + var currentNode = getParentNode(element); + + while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + + return null; + } // Gets the closest ancestor positioned element. Handles some edge cases, + // such as table ancestors and cross browser bugs. + + + function getOffsetParent(element) { + var window = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; + } + + function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; + } + + var max = Math.max; + var min = Math.min; + var round = Math.round; + + function within(min$1, value, max$1) { + return max(min$1, min(value, max$1)); + } + + function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; + } + + function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); + } + + function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); + } + + var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + }; + + function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === 'y' ? top : left; + var maxProp = axis === 'y' ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = within(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); + } + + function effect$1(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (!contains(state.elements.popper, arrowElement)) { + + return; + } + + state.elements.arrow = arrowElement; + } // eslint-disable-next-line import/no-unused-modules + + + const arrow$1 = { + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect$1, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] + }; + + function getVariation(placement) { + return placement.split('-')[1]; + } + + var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' + }; // Round the offsets to the nearest suitable subpixel based on the DPR. + // Zooming can change the DPR, but it seems to report a value that will + // cleanly divide the values into the appropriate subpixels. + + function roundOffsetsByDPR(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(round(x * dpr) / dpr) || 0, + y: round(round(y * dpr) / dpr) || 0 + }; + } + + function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + variation = _ref2.variation, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets; + + var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets, + _ref3$x = _ref3.x, + x = _ref3$x === void 0 ? 0 : _ref3$x, + _ref3$y = _ref3.y, + y = _ref3$y === void 0 ? 0 : _ref3$y; + + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = left; + var sideY = top; + var win = window; + + if (adaptive) { + var offsetParent = getOffsetParent(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === getWindow(popper)) { + offsetParent = getDocumentElement(popper); + + if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; // $FlowFixMe[prop-missing] + + y -= offsetParent[heightProp] - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; // $FlowFixMe[prop-missing] + + x -= offsetParent[widthProp] - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); + } + + function computeStyles(_ref4) { + var state = _ref4.state, + options = _ref4.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const computeStyles$1 = { + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} + }; + + var passive = { + passive: true + }; + + function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; + } // eslint-disable-next-line import/no-unused-modules + + + const eventListeners = { + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} + }; + + var hash$1 = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' + }; + function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash$1[matched]; + }); + } + + var hash = { + start: 'end', + end: 'start' + }; + function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); + } + + function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; + } + + function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; + } + + function getViewportRect(element) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper + // can be obscured underneath it. + // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even + // if it isn't open, so if this isn't available, the popper will be detected + // to overflow the bottom of the screen too early. + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) + // In Chrome, it returns a value very close to 0 (+/-) but contains rounding + // errors due to floating point numbers, so we need to check precision. + // Safari returns a number <= 0, usually < -1 when pinch-zoomed + // Feature detection fails in mobile emulation mode in Chrome. + // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < + // 0.001 + // Fallback here: "Not Safari" userAgent + + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + + return { + width: width, + height: height, + x: x + getWindowScrollBarX(element), + y: y + }; + } + + // of the `` and `` rect bounds if horizontally scrollable + + function getDocumentRect(element) { + var _element$ownerDocumen; + + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + + if (getComputedStyle$1(body || html).direction === 'rtl') { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + + return { + width: width, + height: height, + x: x, + y: y + }; + } + + function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = getComputedStyle$1(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); + } + + function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + + return getScrollParent(getParentNode(node)); + } + + /* + given a DOM element, return the list of all scroll parents, up the list of ancesors + until we get to the top window object. This list is what we attach scroll listeners + to, because if any of these parent elements scroll, we'll need to re-calculate the + reference element's position. + */ + + function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))); + } + + function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); + } + + function getInnerBoundingClientRect(element) { + var rect = getBoundingClientRect(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; + } + + function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); + } // A "clipping parent" is an overflowable container with the characteristic of + // clipping (or hiding) overflowing elements with a position different from + // `initial` + + + function getClippingParents(element) { + var clippingParents = listScrollParents(getParentNode(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + + if (!isElement(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; + }); + } // Gets the maximum area that the element is visible in due to any number of + // clipping parents + + + function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; + } + + function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case bottom: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case right: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case left: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + } + } + + return offsets; + } + + function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === popper && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; + } + + function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { + return getVariation(placement) === variation; + }) : basePlacements; + var allowedPlacements = placements$1.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements$1; + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[getBasePlacement(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); + } + + function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; + } + + function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = getBasePlacement(placement); + + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } + } // eslint-disable-next-line import/no-unused-modules + + + const flip$1 = { + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } + }; + + function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; + } + + function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function (side) { + return overflow[side] >= 0; + }); + } + + function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: 'reference' + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); + } // eslint-disable-next-line import/no-unused-modules + + + const hide$1 = { + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide + }; + + function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; + } + + function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const offset$1 = { + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset + }; + + function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const popperOffsets$1 = { + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} + }; + + function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; + } + + function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis || checkAltAxis) { + var mainSide = mainAxis === 'y' ? top : left; + var altSide = mainAxis === 'y' ? bottom : right; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min$1 = popperOffsets[mainAxis] + overflow[mainSide]; + var max$1 = popperOffsets[mainAxis] - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; + var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; + var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; + + if (checkMainAxis) { + var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _mainSide = mainAxis === 'x' ? top : left; + + var _altSide = mainAxis === 'x' ? bottom : right; + + var _offset = popperOffsets[altAxis]; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const preventOverflow$1 = { + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] + }; + + function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + + function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } + } + + function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = rect.width / element.offsetWidth || 1; + var scaleY = rect.height / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; + } // Returns the composite rect of an element relative to its offsetParent. + // Composite means it takes into account transforms as well as layout. + + + function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var isOffsetParentAnElement = isHTMLElement(offsetParent); + isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; + } + + function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; + } + + function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return modifierPhases.reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); + } + + function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; + } + + function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); + } + + var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' + }; + + function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); + } + + function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(setOptionsAction) { + var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], + popper: listScrollParents(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), + popper: getLayoutRect(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + + for (var index = 0; index < state.orderedModifiers.length; index++) { + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; + } + var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; + var createPopper$1 = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers$1 + }); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; + var createPopper = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers + }); // eslint-disable-next-line import/no-unused-modules + + const Popper = /*#__PURE__*/Object.freeze({ + __proto__: null, + popperGenerator, + detectOverflow, + createPopperBase: createPopper$2, + createPopper, + createPopperLite: createPopper$1, + top, + bottom, + right, + left, + auto, + basePlacements, + start, + end, + clippingParents, + viewport, + popper, + reference, + variationPlacements, + placements, + beforeRead, + read, + afterRead, + beforeMain, + main, + afterMain, + beforeWrite, + write, + afterWrite, + modifierPhases, + applyStyles: applyStyles$1, + arrow: arrow$1, + computeStyles: computeStyles$1, + eventListeners, + flip: flip$1, + hide: hide$1, + offset: offset$1, + popperOffsets: popperOffsets$1, + preventOverflow: preventOverflow$1 + }); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): dropdown.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$9 = 'dropdown'; + const DATA_KEY$8 = 'bs.dropdown'; + const EVENT_KEY$8 = `.${DATA_KEY$8}`; + const DATA_API_KEY$4 = '.data-api'; + const ESCAPE_KEY$2 = 'Escape'; + const SPACE_KEY = 'Space'; + const TAB_KEY$1 = 'Tab'; + const ARROW_UP_KEY = 'ArrowUp'; + const ARROW_DOWN_KEY = 'ArrowDown'; + const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button + + const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`); + const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`; + const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`; + const EVENT_SHOW$4 = `show${EVENT_KEY$8}`; + const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`; + const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`; + const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`; + const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`; + const CLASS_NAME_SHOW$6 = 'show'; + const CLASS_NAME_DROPUP = 'dropup'; + const CLASS_NAME_DROPEND = 'dropend'; + const CLASS_NAME_DROPSTART = 'dropstart'; + const CLASS_NAME_NAVBAR = 'navbar'; + const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]'; + const SELECTOR_MENU = '.dropdown-menu'; + const SELECTOR_NAVBAR_NAV = '.navbar-nav'; + const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; + const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'; + const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'; + const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'; + const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'; + const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'; + const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'; + const Default$8 = { + offset: [0, 2], + boundary: 'clippingParents', + reference: 'toggle', + display: 'dynamic', + popperConfig: null, + autoClose: true + }; + const DefaultType$8 = { + offset: '(array|string|function)', + boundary: '(string|element)', + reference: '(string|element|object)', + display: 'string', + popperConfig: '(null|object|function)', + autoClose: '(boolean|string)' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Dropdown extends BaseComponent { + constructor(element, config) { + super(element); + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + } // Getters + + + static get Default() { + return Default$8; + } + + static get DefaultType() { + return DefaultType$8; + } + + static get NAME() { + return NAME$9; + } // Public + + + toggle() { + return this._isShown() ? this.hide() : this.show(); + } + + show() { + if (isDisabled(this._element) || this._isShown(this._menu)) { + return; + } + + const relatedTarget = { + relatedTarget: this._element + }; + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget); + + if (showEvent.defaultPrevented) { + return; + } + + const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar + + if (this._inNavbar) { + Manipulator.setDataAttribute(this._menu, 'popper', 'none'); + } else { + this._createPopper(parent); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) { + [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop)); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + this._menu.classList.add(CLASS_NAME_SHOW$6); + + this._element.classList.add(CLASS_NAME_SHOW$6); + + EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget); + } + + hide() { + if (isDisabled(this._element) || !this._isShown(this._menu)) { + return; + } + + const relatedTarget = { + relatedTarget: this._element + }; + + this._completeHide(relatedTarget); + } + + dispose() { + if (this._popper) { + this._popper.destroy(); + } + + super.dispose(); + } + + update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper) { + this._popper.update(); + } + } // Private + + + _completeHide(relatedTarget) { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget); + + if (hideEvent.defaultPrevented) { + return; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop)); + } + + if (this._popper) { + this._popper.destroy(); + } + + this._menu.classList.remove(CLASS_NAME_SHOW$6); + + this._element.classList.remove(CLASS_NAME_SHOW$6); + + this._element.setAttribute('aria-expanded', 'false'); + + Manipulator.removeDataAttribute(this._menu, 'popper'); + EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget); + } + + _getConfig(config) { + config = { ...this.constructor.Default, + ...Manipulator.getDataAttributes(this._element), + ...config + }; + typeCheckConfig(NAME$9, config, this.constructor.DefaultType); + + if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { + // Popper virtual elements require a getBoundingClientRect method + throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + } + + return config; + } + + _createPopper(parent) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + } + + let referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (isElement$1(this._config.reference)) { + referenceElement = getElement(this._config.reference); + } else if (typeof this._config.reference === 'object') { + referenceElement = this._config.reference; + } + + const popperConfig = this._getPopperConfig(); + + const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false); + this._popper = createPopper(referenceElement, this._menu, popperConfig); + + if (isDisplayStatic) { + Manipulator.setDataAttribute(this._menu, 'popper', 'static'); + } + } + + _isShown(element = this._element) { + return element.classList.contains(CLASS_NAME_SHOW$6); + } + + _getMenuElement() { + return SelectorEngine.next(this._element, SELECTOR_MENU)[0]; + } + + _getPlacement() { + const parentDropdown = this._element.parentNode; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { + return PLACEMENT_RIGHT; + } + + if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { + return PLACEMENT_LEFT; + } // We need to trim the value because custom properties can also include spaces + + + const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { + return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; + } + + return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; + } + + _detectNavbar() { + return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null; + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(val => Number.parseInt(val, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _getPopperConfig() { + const defaultBsPopperConfig = { + placement: this._getPlacement(), + modifiers: [{ + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }] + }; // Disable Popper if we have a static display + + if (this._config.display === 'static') { + defaultBsPopperConfig.modifiers = [{ + name: 'applyStyles', + enabled: false + }]; + } + + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _selectMenuItem({ + key, + target + }) { + const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible); + + if (!items.length) { + return; + } // if target isn't included in items (e.g. when expanding the dropdown) + // allow cycling to get the last item in case key equals ARROW_UP_KEY + + + getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus(); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Dropdown.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + }); + } + + static clearMenus(event) { + if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) { + return; + } + + const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3); + + for (let i = 0, len = toggles.length; i < len; i++) { + const context = Dropdown.getInstance(toggles[i]); + + if (!context || context._config.autoClose === false) { + continue; + } + + if (!context._isShown()) { + continue; + } + + const relatedTarget = { + relatedTarget: context._element + }; + + if (event) { + const composedPath = event.composedPath(); + const isMenuTarget = composedPath.includes(context._menu); + + if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { + continue; + } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu + + + if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) { + continue; + } + + if (event.type === 'click') { + relatedTarget.clickEvent = event; + } + } + + context._completeHide(relatedTarget); + } + } + + static getParentFromElement(element) { + return getElementFromSelector(element) || element.parentNode; + } + + static dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) { + return; + } + + const isActive = this.classList.contains(CLASS_NAME_SHOW$6); + + if (!isActive && event.key === ESCAPE_KEY$2) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (isDisabled(this)) { + return; + } + + const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0]; + const instance = Dropdown.getOrCreateInstance(getToggleButton); + + if (event.key === ESCAPE_KEY$2) { + instance.hide(); + return; + } + + if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) { + if (!isActive) { + instance.show(); + } + + instance._selectMenuItem(event); + + return; + } + + if (!isActive || event.key === SPACE_KEY) { + Dropdown.clearMenus(); + } + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); + EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { + event.preventDefault(); + Dropdown.getOrCreateInstance(this).toggle(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Dropdown to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Dropdown); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/scrollBar.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; + const SELECTOR_STICKY_CONTENT = '.sticky-top'; + + class ScrollBarHelper { + constructor() { + this._element = document.body; + } + + getWidth() { + // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes + const documentWidth = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - documentWidth); + } + + hide() { + const width = this.getWidth(); + + this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width + + + this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth + + + this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width); + + this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width); + } + + _disableOverFlow() { + this._saveInitialAttribute(this._element, 'overflow'); + + this._element.style.overflow = 'hidden'; + } + + _setElementAttributes(selector, styleProp, callback) { + const scrollbarWidth = this.getWidth(); + + const manipulationCallBack = element => { + if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { + return; + } + + this._saveInitialAttribute(element, styleProp); + + const calculatedValue = window.getComputedStyle(element)[styleProp]; + element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`; + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + reset() { + this._resetElementAttributes(this._element, 'overflow'); + + this._resetElementAttributes(this._element, 'paddingRight'); + + this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight'); + + this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight'); + } + + _saveInitialAttribute(element, styleProp) { + const actualValue = element.style[styleProp]; + + if (actualValue) { + Manipulator.setDataAttribute(element, styleProp, actualValue); + } + } + + _resetElementAttributes(selector, styleProp) { + const manipulationCallBack = element => { + const value = Manipulator.getDataAttribute(element, styleProp); + + if (typeof value === 'undefined') { + element.style.removeProperty(styleProp); + } else { + Manipulator.removeDataAttribute(element, styleProp); + element.style[styleProp] = value; + } + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + _applyManipulationCallback(selector, callBack) { + if (isElement$1(selector)) { + callBack(selector); + } else { + SelectorEngine.find(selector, this._element).forEach(callBack); + } + } + + isOverflowing() { + return this.getWidth() > 0; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/backdrop.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const Default$7 = { + className: 'modal-backdrop', + isVisible: true, + // if false, we use the backdrop helper without adding any element to the dom + isAnimated: false, + rootElement: 'body', + // give the choice to place backdrop under different elements + clickCallback: null + }; + const DefaultType$7 = { + className: 'string', + isVisible: 'boolean', + isAnimated: 'boolean', + rootElement: '(element|string)', + clickCallback: '(function|null)' + }; + const NAME$8 = 'backdrop'; + const CLASS_NAME_FADE$4 = 'fade'; + const CLASS_NAME_SHOW$5 = 'show'; + const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`; + + class Backdrop { + constructor(config) { + this._config = this._getConfig(config); + this._isAppended = false; + this._element = null; + } + + show(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._append(); + + if (this._config.isAnimated) { + reflow(this._getElement()); + } + + this._getElement().classList.add(CLASS_NAME_SHOW$5); + + this._emulateAnimation(() => { + execute(callback); + }); + } + + hide(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._getElement().classList.remove(CLASS_NAME_SHOW$5); + + this._emulateAnimation(() => { + this.dispose(); + execute(callback); + }); + } // Private + + + _getElement() { + if (!this._element) { + const backdrop = document.createElement('div'); + backdrop.className = this._config.className; + + if (this._config.isAnimated) { + backdrop.classList.add(CLASS_NAME_FADE$4); + } + + this._element = backdrop; + } + + return this._element; + } + + _getConfig(config) { + config = { ...Default$7, + ...(typeof config === 'object' ? config : {}) + }; // use getElement() with the default "body" to get a fresh Element on each instantiation + + config.rootElement = getElement(config.rootElement); + typeCheckConfig(NAME$8, config, DefaultType$7); + return config; + } + + _append() { + if (this._isAppended) { + return; + } + + this._config.rootElement.append(this._getElement()); + + EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => { + execute(this._config.clickCallback); + }); + this._isAppended = true; + } + + dispose() { + if (!this._isAppended) { + return; + } + + EventHandler.off(this._element, EVENT_MOUSEDOWN); + + this._element.remove(); + + this._isAppended = false; + } + + _emulateAnimation(callback) { + executeAfterTransition(callback, this._getElement(), this._config.isAnimated); + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/focustrap.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const Default$6 = { + trapElement: null, + // The element to trap focus inside of + autofocus: true + }; + const DefaultType$6 = { + trapElement: 'element', + autofocus: 'boolean' + }; + const NAME$7 = 'focustrap'; + const DATA_KEY$7 = 'bs.focustrap'; + const EVENT_KEY$7 = `.${DATA_KEY$7}`; + const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`; + const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`; + const TAB_KEY = 'Tab'; + const TAB_NAV_FORWARD = 'forward'; + const TAB_NAV_BACKWARD = 'backward'; + + class FocusTrap { + constructor(config) { + this._config = this._getConfig(config); + this._isActive = false; + this._lastTabNavDirection = null; + } + + activate() { + const { + trapElement, + autofocus + } = this._config; + + if (this._isActive) { + return; + } + + if (autofocus) { + trapElement.focus(); + } + + EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop + + EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event)); + EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event)); + this._isActive = true; + } + + deactivate() { + if (!this._isActive) { + return; + } + + this._isActive = false; + EventHandler.off(document, EVENT_KEY$7); + } // Private + + + _handleFocusin(event) { + const { + target + } = event; + const { + trapElement + } = this._config; + + if (target === document || target === trapElement || trapElement.contains(target)) { + return; + } + + const elements = SelectorEngine.focusableChildren(trapElement); + + if (elements.length === 0) { + trapElement.focus(); + } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { + elements[elements.length - 1].focus(); + } else { + elements[0].focus(); + } + } + + _handleKeydown(event) { + if (event.key !== TAB_KEY) { + return; + } + + this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; + } + + _getConfig(config) { + config = { ...Default$6, + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$7, config, DefaultType$6); + return config; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): modal.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$6 = 'modal'; + const DATA_KEY$6 = 'bs.modal'; + const EVENT_KEY$6 = `.${DATA_KEY$6}`; + const DATA_API_KEY$3 = '.data-api'; + const ESCAPE_KEY$1 = 'Escape'; + const Default$5 = { + backdrop: true, + keyboard: true, + focus: true + }; + const DefaultType$5 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean' + }; + const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`; + const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`; + const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`; + const EVENT_SHOW$3 = `show${EVENT_KEY$6}`; + const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`; + const EVENT_RESIZE = `resize${EVENT_KEY$6}`; + const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`; + const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`; + const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`; + const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`; + const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`; + const CLASS_NAME_OPEN = 'modal-open'; + const CLASS_NAME_FADE$3 = 'fade'; + const CLASS_NAME_SHOW$4 = 'show'; + const CLASS_NAME_STATIC = 'modal-static'; + const OPEN_SELECTOR$1 = '.modal.show'; + const SELECTOR_DIALOG = '.modal-dialog'; + const SELECTOR_MODAL_BODY = '.modal-body'; + const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Modal extends BaseComponent { + constructor(element, config) { + super(element); + this._config = this._getConfig(config); + this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + this._isShown = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollBar = new ScrollBarHelper(); + } // Getters + + + static get Default() { + return Default$5; + } + + static get NAME() { + return NAME$6; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown || this._isTransitioning) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + + if (this._isAnimated()) { + this._isTransitioning = true; + } + + this._scrollBar.hide(); + + document.body.classList.add(CLASS_NAME_OPEN); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => { + EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => { + if (event.target === this._element) { + this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(() => this._showElement(relatedTarget)); + } + + hide() { + if (!this._isShown || this._isTransitioning) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); + + if (hideEvent.defaultPrevented) { + return; + } + + this._isShown = false; + + const isAnimated = this._isAnimated(); + + if (isAnimated) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + this._focustrap.deactivate(); + + this._element.classList.remove(CLASS_NAME_SHOW$4); + + EventHandler.off(this._element, EVENT_CLICK_DISMISS); + EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS); + + this._queueCallback(() => this._hideModal(), this._element, isAnimated); + } + + dispose() { + [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6)); + + this._backdrop.dispose(); + + this._focustrap.deactivate(); + + super.dispose(); + } + + handleUpdate() { + this._adjustDialog(); + } // Private + + + _initializeBackDrop() { + return new Backdrop({ + isVisible: Boolean(this._config.backdrop), + // 'static' option will be translated to true, and booleans will keep their value + isAnimated: this._isAnimated() + }); + } + + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + + _getConfig(config) { + config = { ...Default$5, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$6, config, DefaultType$5); + return config; + } + + _showElement(relatedTarget) { + const isAnimated = this._isAnimated(); + + const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.append(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.scrollTop = 0; + + if (modalBody) { + modalBody.scrollTop = 0; + } + + if (isAnimated) { + reflow(this._element); + } + + this._element.classList.add(CLASS_NAME_SHOW$4); + + const transitionComplete = () => { + if (this._config.focus) { + this._focustrap.activate(); + } + + this._isTransitioning = false; + EventHandler.trigger(this._element, EVENT_SHOWN$3, { + relatedTarget + }); + }; + + this._queueCallback(transitionComplete, this._dialog, isAnimated); + } + + _setEscapeEvent() { + if (this._isShown) { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => { + if (this._config.keyboard && event.key === ESCAPE_KEY$1) { + event.preventDefault(); + this.hide(); + } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) { + this._triggerBackdropTransition(); + } + }); + } else { + EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1); + } + } + + _setResizeEvent() { + if (this._isShown) { + EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog()); + } else { + EventHandler.off(window, EVENT_RESIZE); + } + } + + _hideModal() { + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._isTransitioning = false; + + this._backdrop.hide(() => { + document.body.classList.remove(CLASS_NAME_OPEN); + + this._resetAdjustments(); + + this._scrollBar.reset(); + + EventHandler.trigger(this._element, EVENT_HIDDEN$3); + }); + } + + _showBackdrop(callback) { + EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => { + if (this._ignoreBackdropClick) { + this._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + if (this._config.backdrop === true) { + this.hide(); + } else if (this._config.backdrop === 'static') { + this._triggerBackdropTransition(); + } + }); + + this._backdrop.show(callback); + } + + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_FADE$3); + } + + _triggerBackdropTransition() { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + + if (hideEvent.defaultPrevented) { + return; + } + + const { + classList, + scrollHeight, + style + } = this._element; + const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed + + if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) { + return; + } + + if (!isModalOverflowing) { + style.overflowY = 'hidden'; + } + + classList.add(CLASS_NAME_STATIC); + + this._queueCallback(() => { + classList.remove(CLASS_NAME_STATIC); + + if (!isModalOverflowing) { + this._queueCallback(() => { + style.overflowY = ''; + }, this._dialog); + } + }, this._dialog); + + this._element.focus(); + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // ---------------------------------------------------------------------- + + + _adjustDialog() { + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + const scrollbarWidth = this._scrollBar.getWidth(); + + const isBodyOverflowing = scrollbarWidth > 0; + + if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) { + this._element.style.paddingLeft = `${scrollbarWidth}px`; + } + + if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) { + this._element.style.paddingRight = `${scrollbarWidth}px`; + } + } + + _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + } // Static + + + static jQueryInterface(config, relatedTarget) { + return this.each(function () { + const data = Modal.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](relatedTarget); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + EventHandler.one(target, EVENT_SHOW$3, showEvent => { + if (showEvent.defaultPrevented) { + // only register focus restorer if modal will actually get shown + return; + } + + EventHandler.one(target, EVENT_HIDDEN$3, () => { + if (isVisible(this)) { + this.focus(); + } + }); + }); // avoid conflict when clicking moddal toggler while another one is open + + const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1); + + if (allReadyOpen) { + Modal.getInstance(allReadyOpen).hide(); + } + + const data = Modal.getOrCreateInstance(target); + data.toggle(this); + }); + enableDismissTrigger(Modal); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Modal to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Modal); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): offcanvas.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$5 = 'offcanvas'; + const DATA_KEY$5 = 'bs.offcanvas'; + const EVENT_KEY$5 = `.${DATA_KEY$5}`; + const DATA_API_KEY$2 = '.data-api'; + const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`; + const ESCAPE_KEY = 'Escape'; + const Default$4 = { + backdrop: true, + keyboard: true, + scroll: false + }; + const DefaultType$4 = { + backdrop: 'boolean', + keyboard: 'boolean', + scroll: 'boolean' + }; + const CLASS_NAME_SHOW$3 = 'show'; + const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; + const OPEN_SELECTOR = '.offcanvas.show'; + const EVENT_SHOW$2 = `show${EVENT_KEY$5}`; + const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`; + const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`; + const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`; + const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`; + const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`; + const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Offcanvas extends BaseComponent { + constructor(element, config) { + super(element); + this._config = this._getConfig(config); + this._isShown = false; + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + + this._addEventListeners(); + } // Getters + + + static get NAME() { + return NAME$5; + } + + static get Default() { + return Default$4; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + this._element.style.visibility = 'visible'; + + this._backdrop.show(); + + if (!this._config.scroll) { + new ScrollBarHelper().hide(); + } + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.classList.add(CLASS_NAME_SHOW$3); + + const completeCallBack = () => { + if (!this._config.scroll) { + this._focustrap.activate(); + } + + EventHandler.trigger(this._element, EVENT_SHOWN$2, { + relatedTarget + }); + }; + + this._queueCallback(completeCallBack, this._element, true); + } + + hide() { + if (!this._isShown) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2); + + if (hideEvent.defaultPrevented) { + return; + } + + this._focustrap.deactivate(); + + this._element.blur(); + + this._isShown = false; + + this._element.classList.remove(CLASS_NAME_SHOW$3); + + this._backdrop.hide(); + + const completeCallback = () => { + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._element.style.visibility = 'hidden'; + + if (!this._config.scroll) { + new ScrollBarHelper().reset(); + } + + EventHandler.trigger(this._element, EVENT_HIDDEN$2); + }; + + this._queueCallback(completeCallback, this._element, true); + } + + dispose() { + this._backdrop.dispose(); + + this._focustrap.deactivate(); + + super.dispose(); + } // Private + + + _getConfig(config) { + config = { ...Default$4, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$5, config, DefaultType$4); + return config; + } + + _initializeBackDrop() { + return new Backdrop({ + className: CLASS_NAME_BACKDROP, + isVisible: this._config.backdrop, + isAnimated: true, + rootElement: this._element.parentNode, + clickCallback: () => this.hide() + }); + } + + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + + _addEventListeners() { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { + if (this._config.keyboard && event.key === ESCAPE_KEY) { + this.hide(); + } + }); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Offcanvas.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](this); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + if (isDisabled(this)) { + return; + } + + EventHandler.one(target, EVENT_HIDDEN$2, () => { + // focus on trigger when it is closed + if (isVisible(this)) { + this.focus(); + } + }); // avoid conflict when clicking a toggler of an offcanvas, while another is open + + const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); + + if (allReadyOpen && allReadyOpen !== target) { + Offcanvas.getInstance(allReadyOpen).hide(); + } + + const data = Offcanvas.getOrCreateInstance(target); + data.toggle(this); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())); + enableDismissTrigger(Offcanvas); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + defineJQueryPlugin(Offcanvas); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): util/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); + const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + + const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + + const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; + + const allowedAttribute = (attribute, allowedAttributeList) => { + const attributeName = attribute.nodeName.toLowerCase(); + + if (allowedAttributeList.includes(attributeName)) { + if (uriAttributes.has(attributeName)) { + return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)); + } + + return true; + } + + const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute. + + for (let i = 0, len = regExp.length; i < len; i++) { + if (regExp[i].test(attributeName)) { + return true; + } + } + + return false; + }; + + const DefaultAllowlist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) { + if (!unsafeHtml.length) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + const domParser = new window.DOMParser(); + const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + const elements = [].concat(...createdDocument.body.querySelectorAll('*')); + + for (let i = 0, len = elements.length; i < len; i++) { + const element = elements[i]; + const elementName = element.nodeName.toLowerCase(); + + if (!Object.keys(allowList).includes(elementName)) { + element.remove(); + continue; + } + + const attributeList = [].concat(...element.attributes); + const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); + attributeList.forEach(attribute => { + if (!allowedAttribute(attribute, allowedAttributes)) { + element.removeAttribute(attribute.nodeName); + } + }); + } + + return createdDocument.body.innerHTML; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): tooltip.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$4 = 'tooltip'; + const DATA_KEY$4 = 'bs.tooltip'; + const EVENT_KEY$4 = `.${DATA_KEY$4}`; + const CLASS_PREFIX$1 = 'bs-tooltip'; + const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); + const DefaultType$3 = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(array|string|function)', + container: '(string|element|boolean)', + fallbackPlacements: 'array', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + allowList: 'object', + popperConfig: '(null|object|function)' + }; + const AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: isRTL() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: isRTL() ? 'right' : 'left' + }; + const Default$3 = { + animation: true, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: [0, 0], + container: false, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + boundary: 'clippingParents', + customClass: '', + sanitize: true, + sanitizeFn: null, + allowList: DefaultAllowlist, + popperConfig: null + }; + const Event$2 = { + HIDE: `hide${EVENT_KEY$4}`, + HIDDEN: `hidden${EVENT_KEY$4}`, + SHOW: `show${EVENT_KEY$4}`, + SHOWN: `shown${EVENT_KEY$4}`, + INSERTED: `inserted${EVENT_KEY$4}`, + CLICK: `click${EVENT_KEY$4}`, + FOCUSIN: `focusin${EVENT_KEY$4}`, + FOCUSOUT: `focusout${EVENT_KEY$4}`, + MOUSEENTER: `mouseenter${EVENT_KEY$4}`, + MOUSELEAVE: `mouseleave${EVENT_KEY$4}` + }; + const CLASS_NAME_FADE$2 = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW$2 = 'show'; + const HOVER_STATE_SHOW = 'show'; + const HOVER_STATE_OUT = 'out'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; + const EVENT_MODAL_HIDE = 'hide.bs.modal'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Tooltip extends BaseComponent { + constructor(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } + + super(element); // private + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this._config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + static get Default() { + return Default$3; + } + + static get NAME() { + return NAME$4; + } + + static get Event() { + return Event$2; + } + + static get DefaultType() { + return DefaultType$3; + } // Public + + + enable() { + this._isEnabled = true; + } + + disable() { + this._isEnabled = false; + } + + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + + toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + } + + dispose() { + clearTimeout(this._timeout); + EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + + if (this.tip) { + this.tip.remove(); + } + + this._disposePopper(); + + super.dispose(); + } + + show() { + if (this._element.style.display === 'none') { + throw new Error('Please use show on visible elements'); + } + + if (!(this.isWithContent() && this._isEnabled)) { + return; + } + + const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW); + const shadowRoot = findShadowRoot(this._element); + const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element); + + if (showEvent.defaultPrevented || !isInTheDom) { + return; + } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title` + // This will be removed later in favor of a `setContent` method + + + if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) { + this._disposePopper(); + + this.tip.remove(); + this.tip = null; + } + + const tip = this.getTipElement(); + const tipId = getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + + this._element.setAttribute('aria-describedby', tipId); + + if (this._config.animation) { + tip.classList.add(CLASS_NAME_FADE$2); + } + + const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; + + const attachment = this._getAttachment(placement); + + this._addAttachmentClass(attachment); + + const { + container + } = this._config; + Data.set(tip, this.constructor.DATA_KEY, this); + + if (!this._element.ownerDocument.documentElement.contains(this.tip)) { + container.append(tip); + EventHandler.trigger(this._element, this.constructor.Event.INSERTED); + } + + if (this._popper) { + this._popper.update(); + } else { + this._popper = createPopper(this._element, tip, this._getPopperConfig(attachment)); + } + + tip.classList.add(CLASS_NAME_SHOW$2); + + const customClass = this._resolvePossibleFunction(this._config.customClass); + + if (customClass) { + tip.classList.add(...customClass.split(' ')); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(element => { + EventHandler.on(element, 'mouseover', noop); + }); + } + + const complete = () => { + const prevHoverState = this._hoverState; + this._hoverState = null; + EventHandler.trigger(this._element, this.constructor.Event.SHOWN); + + if (prevHoverState === HOVER_STATE_OUT) { + this._leave(null, this); + } + }; + + const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2); + + this._queueCallback(complete, this.tip, isAnimated); + } + + hide() { + if (!this._popper) { + return; + } + + const tip = this.getTipElement(); + + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } + + if (this._hoverState !== HOVER_STATE_SHOW) { + tip.remove(); + } + + this._cleanTipClass(); + + this._element.removeAttribute('aria-describedby'); + + EventHandler.trigger(this._element, this.constructor.Event.HIDDEN); + + this._disposePopper(); + }; + + const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE); + + if (hideEvent.defaultPrevented) { + return; + } + + tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop)); + } + + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2); + + this._queueCallback(complete, this.tip, isAnimated); + + this._hoverState = ''; + } + + update() { + if (this._popper !== null) { + this._popper.update(); + } + } // Protected + + + isWithContent() { + return Boolean(this.getTitle()); + } + + getTipElement() { + if (this.tip) { + return this.tip; + } + + const element = document.createElement('div'); + element.innerHTML = this._config.template; + const tip = element.children[0]; + this.setContent(tip); + tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); + this.tip = tip; + return this.tip; + } + + setContent(tip) { + this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER); + } + + _sanitizeAndSetContent(template, content, selector) { + const templateElement = SelectorEngine.findOne(selector, template); + + if (!content && templateElement) { + templateElement.remove(); + return; + } // we use append for html objects to maintain js events + + + this.setElementContent(templateElement, content); + } + + setElementContent(element, content) { + if (element === null) { + return; + } + + if (isElement$1(content)) { + content = getElement(content); // content is a DOM node or a jQuery + + if (this._config.html) { + if (content.parentNode !== element) { + element.innerHTML = ''; + element.append(content); + } + } else { + element.textContent = content.textContent; + } + + return; + } + + if (this._config.html) { + if (this._config.sanitize) { + content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn); + } + + element.innerHTML = content; + } else { + element.textContent = content; + } + } + + getTitle() { + const title = this._element.getAttribute('data-bs-original-title') || this._config.title; + + return this._resolvePossibleFunction(title); + } + + updateAttachment(attachment) { + if (attachment === 'right') { + return 'end'; + } + + if (attachment === 'left') { + return 'start'; + } + + return attachment; + } // Private + + + _initializeOnDelegatedTarget(event, context) { + return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(val => Number.parseInt(val, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _resolvePossibleFunction(content) { + return typeof content === 'function' ? content.call(this._element) : content; + } + + _getPopperConfig(attachment) { + const defaultBsPopperConfig = { + placement: attachment, + modifiers: [{ + name: 'flip', + options: { + fallbackPlacements: this._config.fallbackPlacements + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }, { + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'arrow', + options: { + element: `.${this.constructor.NAME}-arrow` + } + }, { + name: 'onChange', + enabled: true, + phase: 'afterWrite', + fn: data => this._handlePopperPlacementChange(data) + }], + onFirstUpdate: data => { + if (data.options.placement !== data.placement) { + this._handlePopperPlacementChange(data); + } + } + }; + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _addAttachmentClass(attachment) { + this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`); + } + + _getAttachment(placement) { + return AttachmentMap[placement.toUpperCase()]; + } + + _setListeners() { + const triggers = this._config.trigger.split(' '); + + triggers.forEach(trigger => { + if (trigger === 'click') { + EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event)); + } else if (trigger !== TRIGGER_MANUAL) { + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN; + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT; + EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event)); + EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event)); + } + }); + + this._hideModalHandler = () => { + if (this._element) { + this.hide(); + } + }; + + EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + + if (this._config.selector) { + this._config = { ...this._config, + trigger: 'manual', + selector: '' + }; + } else { + this._fixTitle(); + } + } + + _fixTitle() { + const title = this._element.getAttribute('title'); + + const originalTitleType = typeof this._element.getAttribute('data-bs-original-title'); + + if (title || originalTitleType !== 'string') { + this._element.setAttribute('data-bs-original-title', title || ''); + + if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) { + this._element.setAttribute('aria-label', title); + } + + this._element.setAttribute('title', ''); + } + } + + _enter(event, context) { + context = this._initializeOnDelegatedTarget(event, context); + + if (event) { + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + } + + if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) { + context._hoverState = HOVER_STATE_SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_SHOW; + + if (!context._config.delay || !context._config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(() => { + if (context._hoverState === HOVER_STATE_SHOW) { + context.show(); + } + }, context._config.delay.show); + } + + _leave(event, context) { + context = this._initializeOnDelegatedTarget(event, context); + + if (event) { + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_OUT; + + if (!context._config.delay || !context._config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(() => { + if (context._hoverState === HOVER_STATE_OUT) { + context.hide(); + } + }, context._config.delay.hide); + } + + _isWithActiveTrigger() { + for (const trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + } + + _getConfig(config) { + const dataAttributes = Manipulator.getDataAttributes(this._element); + Object.keys(dataAttributes).forEach(dataAttr => { + if (DISALLOWED_ATTRIBUTES.has(dataAttr)) { + delete dataAttributes[dataAttr]; + } + }); + config = { ...this.constructor.Default, + ...dataAttributes, + ...(typeof config === 'object' && config ? config : {}) + }; + config.container = config.container === false ? document.body : getElement(config.container); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + typeCheckConfig(NAME$4, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn); + } + + return config; + } + + _getDelegateConfig() { + const config = {}; + + for (const key in this._config) { + if (this.constructor.Default[key] !== this._config[key]) { + config[key] = this._config[key]; + } + } // In the future can be replaced with: + // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) + // `Object.fromEntries(keysWithDifferentValues)` + + + return config; + } + + _cleanTipClass() { + const tip = this.getTipElement(); + const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g'); + const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex); + + if (tabClass !== null && tabClass.length > 0) { + tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass)); + } + } + + _getBasicClassPrefix() { + return CLASS_PREFIX$1; + } + + _handlePopperPlacementChange(popperData) { + const { + state + } = popperData; + + if (!state) { + return; + } + + this.tip = state.elements.popper; + + this._cleanTipClass(); + + this._addAttachmentClass(this._getAttachment(state.placement)); + } + + _disposePopper() { + if (this._popper) { + this._popper.destroy(); + + this._popper = null; + } + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Tooltip.getOrCreateInstance(this, config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Tooltip to jQuery only if jQuery is present + */ + + + defineJQueryPlugin(Tooltip); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): popover.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$3 = 'popover'; + const DATA_KEY$3 = 'bs.popover'; + const EVENT_KEY$3 = `.${DATA_KEY$3}`; + const CLASS_PREFIX = 'bs-popover'; + const Default$2 = { ...Tooltip.Default, + placement: 'right', + offset: [0, 8], + trigger: 'click', + content: '', + template: '' + }; + const DefaultType$2 = { ...Tooltip.DefaultType, + content: '(string|element|function)' + }; + const Event$1 = { + HIDE: `hide${EVENT_KEY$3}`, + HIDDEN: `hidden${EVENT_KEY$3}`, + SHOW: `show${EVENT_KEY$3}`, + SHOWN: `shown${EVENT_KEY$3}`, + INSERTED: `inserted${EVENT_KEY$3}`, + CLICK: `click${EVENT_KEY$3}`, + FOCUSIN: `focusin${EVENT_KEY$3}`, + FOCUSOUT: `focusout${EVENT_KEY$3}`, + MOUSEENTER: `mouseenter${EVENT_KEY$3}`, + MOUSELEAVE: `mouseleave${EVENT_KEY$3}` + }; + const SELECTOR_TITLE = '.popover-header'; + const SELECTOR_CONTENT = '.popover-body'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Popover extends Tooltip { + // Getters + static get Default() { + return Default$2; + } + + static get NAME() { + return NAME$3; + } + + static get Event() { + return Event$1; + } + + static get DefaultType() { + return DefaultType$2; + } // Overrides + + + isWithContent() { + return this.getTitle() || this._getContent(); + } + + setContent(tip) { + this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE); + + this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT); + } // Private + + + _getContent() { + return this._resolvePossibleFunction(this._config.content); + } + + _getBasicClassPrefix() { + return CLASS_PREFIX; + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Popover.getOrCreateInstance(this, config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Popover to jQuery only if jQuery is present + */ + + + defineJQueryPlugin(Popover); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.3): scrollspy.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$2 = 'scrollspy'; + const DATA_KEY$2 = 'bs.scrollspy'; + const EVENT_KEY$2 = `.${DATA_KEY$2}`; + const DATA_API_KEY$1 = '.data-api'; + const Default$1 = { + offset: 10, + method: 'auto', + target: '' + }; + const DefaultType$1 = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`; + const EVENT_SCROLL = `scroll${EVENT_KEY$2}`; + const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`; + const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; + const CLASS_NAME_ACTIVE$1 = 'active'; + const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; + const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group'; + const SELECTOR_NAV_LINKS = '.nav-link'; + const SELECTOR_NAV_ITEMS = '.nav-item'; + const SELECTOR_LIST_ITEMS = '.list-group-item'; + const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`; + const SELECTOR_DROPDOWN$1 = '.dropdown'; + const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; + const METHOD_OFFSET = 'offset'; + const METHOD_POSITION = 'position'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class ScrollSpy extends BaseComponent { + constructor(element, config) { + super(element); + this._scrollElement = this._element.tagName === 'BODY' ? window : this._element; + this._config = this._getConfig(config); + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process()); + this.refresh(); + + this._process(); + } // Getters + + + static get Default() { + return Default$1; + } + + static get NAME() { + return NAME$2; + } // Public + + + refresh() { + const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; + const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target); + targets.map(element => { + const targetSelector = getSelectorFromElement(element); + const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null; + + if (target) { + const targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => { + this._offsets.push(item[0]); + + this._targets.push(item[1]); + }); + } + + dispose() { + EventHandler.off(this._scrollElement, EVENT_KEY$2); + super.dispose(); + } // Private + + + _getConfig(config) { + config = { ...Default$1, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' && config ? config : {}) + }; + config.target = getElement(config.target) || document.documentElement; + typeCheckConfig(NAME$2, config, DefaultType$1); + return config; + } + + _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + } + + _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + } + + _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + } + + _process() { + const scrollTop = this._getScrollTop() + this._config.offset; + + const scrollHeight = this._getScrollHeight(); + + const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + const target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + for (let i = this._offsets.length; i--;) { + const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + } + + _activate(target) { + this._activeTarget = target; + + this._clear(); + + const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`); + const link = SelectorEngine.findOne(queries.join(','), this._config.target); + link.classList.add(CLASS_NAME_ACTIVE$1); + + if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { + SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1); + } else { + SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => { + // Set triggered links parents as active + // With both